Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android spinner fire event when same item selection is made

I want to fire a event when the same item is selected in spinner. Method

@Override
    public void onItemSelected(AdapterView<?> parent, View arg1, int position,
            long arg3) {
    }

is called only when we different selection is made. My Purpose is to display a toast when any item is selected either the same item is reselected or different selection is made.

@Override
    public void onNothingSelected(AdapterView<?> parent) {

    }

above method does not solve my problem.

like image 858
Connecting life with Android Avatar asked Jan 20 '12 05:01

Connecting life with Android


People also ask

How can I tell if spinner is clicked or not in android?

Let the Spinner's first value be something like "-please select-". when the user clicks on the next button perform validation and check whether the value of the selectedItem in the spinner is "-please select-" and if yes, then display a toast and ask the the user to select something from the spinner.


4 Answers

i have found that old selection is kept at variable called mOldSelectedPosition in the hierarcy of the spinner. Spinner is using this value to check if the same item selected or not , and if it is the same , it ignores. If we dont wanna ignore this What i did is some dirty code using reflection.

package com.aradiom.amc.nativecomponents;

import java.lang.reflect.Field;

import android.content.Context;
import android.util.Log;
import android.widget.Spinner;

public class SpinnerTrigger extends Spinner {

public SpinnerTrigger(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

@Override
public void setSelection(int position, boolean animate) {
    ignoreOldSelectionByReflection();
    super.setSelection(position, animate);
}

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

@Override
public void setSelection(int position) {
    ignoreOldSelectionByReflection();
    super.setSelection(position);
}

}

This class will always invalidate the oldselection value , so that every time on click event gets triggered. It may not be perfect solution. Use with caution. :)

like image 128
Suat KARAKUSOGLU Avatar answered Sep 18 '22 14:09

Suat KARAKUSOGLU


Hopefully this help. I tried and it works

/** Spinner extension that calls onItemSelected even when the selection is the same as its previous value */
    public class NDSpinner extends Spinner {

      public NDSpinner(Context context)
      { super(context); }

      public NDSpinner(Context context, AttributeSet attrs)
      { super(context, attrs); }

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

      @Override public void
      setSelection(int position, boolean animate)
      {
        boolean sameSelected = position == getSelectedItemPosition();
        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());
        }
      }

      @Override public void
      setSelection(int position)
      {
        boolean sameSelected = position == getSelectedItemPosition();
        super.setSelection(position);
        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());
        }
      }
    }
like image 31
Eric Leong Zhia Choong Avatar answered Sep 18 '22 14:09

Eric Leong Zhia Choong


Since my reputation is not high enough to comment directly on @Suat 's answer, I tried that method, it works like charm, but I'm not clear what the side effects could be. Something I want to add is, additional constructors should be added to avoid errors.

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

public SpinnerTrigger(Context context, AttributeSet attrs){
super(context,attrs);

}

like image 22
ZijunLost Avatar answered Sep 17 '22 14:09

ZijunLost


You can add a method name on your item selected METHOD

Spinner `Spinner1`=(Spinner)findViewById(R.id.`declareid`)

oBject has been declared for spinner

 @Override
        public void onItemSelected(AdapterView<?> parent, View arg1, int position,
                long arg3) 
    {
    ItemOnChange();
       }

private void ItemOnChange() {

        if(Spinner1.getSelectedItemPosition()>0){
        pd=ProgressDialog.show(this,"","Loading, Please wait .. ",true);

            final int spinner=Spinner1.getSelectedItemPosition();


            final Handler ThreadCallback=new Handler();
            final Runnable runInCityThread=new Runnable(){
                public void run(){
                    fnBindspimmer2();
                    pd.dismiss();
                }

            };

            new Thread(){
                @Override public void run(){

                Spinner2values();
                ThreadCallback.post(runInCityThread);
                }

            }.start();
        }



}
like image 25
Raghav Chopra Avatar answered Sep 20 '22 14:09

Raghav Chopra