I have a listView where each row contains a textView and a Spinner. I can populate both and I can select from the Spinner with no problem. When the user selects from the spinner I can read the selection using onItemSelected().
My problem is that I can't figure out how to identify which row within the listView was selected.
I've tried using a setTag() and setId(), but can't get either of them to give me what I need.
I also tried placing a transparent button over the row and used an onClickListener, but the button obscures the spinner so you don't actually activate the spinner.
Below is my code. I'd be grateful for any help or pointers in the right direction.
I've viewed dozens of related posts on SO, but can't find one which actually answers this problem. Apologies if I've missed it.
Thanks
Code for getView() in adapter.
public class AdapterSelectEventPayment extends BaseAdapter {
private ArrayList<String> mSpinnerItems;
private ArrayList<String> mDataSource;
private Context mContext;
private AdapterView.OnItemSelectedListener mSpinnerItemSelectedListener;
public AdapterSelectEventPayment(ArrayList<String> data, ArrayList<String> spinnerItems, Context context) {
mDataSource = data;
mContext = context;
mSpinnerItems = spinnerItems;
}
@Override
public int getCount() {
return mDataSource.size();
}
@Override
public Object getItem(int position) {
return mDataSource.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.select_event_charge_items, null);
}
TextView textView = (TextView) view.findViewById(R.id.row_item_textview);
Spinner spinner = (Spinner) view.findViewById(R.id.row_item_spinner);
textView.setText(mDataSource.get(position));
ArrayAdapter<String> adapter = new ArrayAdapter<String>(mContext, android.R.layout.simple_spinner_dropdown_item, mSpinnerItems);
spinner.setAdapter(adapter);
spinner.setTag(position);
spinner.setOnItemSelectedListener(mSpinnerItemSelectedListener);
return view;
}
public void setOnSpinnerItemSelectedListener(AdapterView.OnItemSelectedListener listener){
this.mSpinnerItemSelectedListener = listener;
}
}
Code in Main Activity
private void sortArrayList() {
AdapterSelectEventPayment adapter = new AdapterSelectEventPayment(participants, chargeArray, this);
adapter.setOnSpinnerItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
System.out.println("The spinner has been spun... and position is " + position + " and the id = " + id);
System.out.println("Tag is " + selectedItemView.getTag());
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
System.out.println("The spinner has NOT been spun...");
}
});
lvSpinner.setAdapter(adapter);
}
Instead of calling getTag
on selectedItemView
call it on parentView