Skip to content Skip to sidebar Skip to footer

Why Is Onitemselectedlistener Only Called When An Item Changes, But Not On Every User Selection?

I'm using spinner controls in an Android application, and I handle user selections via an onItemSelectedListener() method. This seems to work okay when a different selection from t

Solution 1:

If you want "onItemSelected" of Spinner to be fired, even if the item in the spinner is selected /if item selected and it is clicked again . Then use this custom class which extends spinner ,this worked for me

Then edit your activity with spinners like this , I changed

static Spinner spinner1;

to

static NDSpinner spinner1;

and

variables.spinner1 = (Spinner) findViewById(R.id.spinner1); 

to

variables.spinner1 = (NDSpinner ) findViewById(R.id.spinner1); 

Also I changed the xml layout where the spinner is located

    <Spinner
    android:id="@+id/spinner1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/place" />

to

    <com.yourpackagename.NDSpinner 
     android:id="@+id/spinner1"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:text="@string/place" />

Spinner extension class:

package com.yourpackagename;
 import android.content.Context;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.widget.Spinner;
 import android.widget.Toast;
 import java.lang.reflect.Field;

     /** Spinner extension that calls onItemSelected even when the selection is the same as       its previous value. 
       *   ie This is extended "Customized class of Spinner" to  get the "onItemSelected"      event even if the item in the
     *  Spinner is already  selected by the user*/publicclassNDSpinnerextendsSpinner {

      publicNDSpinner(Context context)
      { super(context); }

      publicNDSpinner(Context context, AttributeSet attrs)
      { super(context, attrs); }

      publicNDSpinner(Context context, AttributeSet attrs, int defStyle)
      { super(context, attrs, defStyle); }


      privatevoidignoreOldSelectionByReflection() {
            try {
                Class<?> c = this.getClass().getSuperclass().getSuperclass().getSuperclass();
                FieldreqField= c.getDeclaredField("mOldSelectedPosition");
                reqField.setAccessible(true);
                reqField.setInt(this, -1);
            } catch (Exception e) {
                Log.d("Exception Private", "ex", e);
                // TODO: handle exception
            }
        }

      @OverridepublicvoidsetSelection(int position, boolean animate)
      {
        booleansameSelected= position == getSelectedItemPosition();
        ignoreOldSelectionByReflection();
        super.setSelection(position, animate);
        if (sameSelected) {
          // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
          getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());


        }
      }
      @OverridepublicvoidsetSelection(int position) {
          ignoreOldSelectionByReflection();
          super.setSelection(position);
      }

    }

Solution 2:

The default Spinner doesn't trigger any event when you select the same item as your currently selected item. You will need to make a custom Spinner in order to do this. See How can I get an event in Android Spinner when the current selected item is selected again?

Solution 3:

Add the same adapter every time if you want to do it using default spinner :

@Override public void onItemSelected(AdapterView adapter, View v, int position, long lng) {

   spinner.setAdapter(adapter);

}

Post a Comment for "Why Is Onitemselectedlistener Only Called When An Item Changes, But Not On Every User Selection?"