Search code examples
androidlistviewtagsspinneradapter

Android / Java - How can I find the row in which a spinner is contained in a listView


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);
    }

Solution

  • Instead of calling getTag on selectedItemView call it on parentView