43

I have two spinners that trigger the onItemSelected event. The question is How can I know which one triggered such event ? So far I tried:

 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{

    Log.d("form","onitemselected");
    switch (view.getId()) {
    case R.id.region_spinner:
        Region r = (Region)sregions.getSelectedItem();
        Log.d("form","regionid:" + r.id);
        break;
    case R.id.state_spinner:
        Log.d("form","state id:");
        break;
    }

But only the first Log is displayed, so there's no match in the switch.

xain
  • 13,159
  • 17
  • 75
  • 119

5 Answers5

93

use:

switch(parent.getId()) {
    ...
}

instead is what you need. The view in your parameter is the actual 'row' (i.e. the clicked child of spinner item), and the parent is the actual 'spinner' that you are after.

xandy
  • 27,357
  • 8
  • 59
  • 64
6

Use below code if you have multiple spinners in one activity and you are using onItemSelected override method

override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
         if (parent!!.id == R.id.spinner_1) {
            // first spinner selected
         } else if (parent!!.id == R.id.spinner_2) {
            // second spinner selected
         }
    }

either you can use switch case

Aditya Patil
  • 1,287
  • 12
  • 19
3

Spinner is a subclass of AdapterView. The parent object passed into the method is the spinner in which the item was selected.

Jems
  • 11,560
  • 1
  • 29
  • 35
1

At first in onCreate :

Spinner cit_for_bus,  bus_number;
cit_for_bus = (Spinner) findViewById(R.id.cit_for_bus);
bus_number = (Spinner) findViewById(R.id.bus_number);
cit_for_bus.setOnItemSelectedListener(this);
bus_number.setOnItemSelectedListener(this);

don't forget to use : you have to bind/tie spinners to onItemSelected

cit_for_bus.setOnItemSelectedListener(this);
bus_number.setOnItemSelectedListener(this);

and use implement for class :

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener

outSide of onCreate use this :

@Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        if (adapterView.getId() == R.id.cit_for_bus) {

            Toast.makeText(getApplicationContext(), adapterView.getId() + "/ " + adapterView.getCount() + "/" + adapterView.getSelectedItem(), Toast.LENGTH_LONG).show();

        } else if (adapterView.getId() == R.id.bus_number) {
            Toast.makeText(getApplicationContext(), adapterView.getId() + "/ " + adapterView.getCount() + "/" + adapterView.getSelectedItem(), Toast.LENGTH_LONG).show();

        }
    }
Moh_beh
  • 251
  • 1
  • 3
  • 14
0

If you import your XML on Kotlin you can use it as so:

override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: 
Long) {
when (parent)
    firstSpinner -> {
        // first spinner selection
        }
    secondSpinner -> {
        // second spinner selected
        }
    }
}
Dan Zeevi
  • 21
  • 2