Событие запуска Android Spinner при выборе одного и того же элемента

Я хочу запустить событие, когда тот же элемент выбран в счетчике. Метод

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

вызывается только тогда, когда мы делаем другой выбор. Моя цель - отображать всплывающее уведомление при выборе любого элемента, либо повторно выбран тот же элемент, либо сделан другой выбор.

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

    }

вышеуказанный метод не решает мою проблему.


person Connecting life with Android    schedule 20.01.2012    source источник


Ответы (5)


используйте прослушиватель кликов, чтобы выполнить ваше требование. поскольку прямой прослушиватель кликов на счетчике не поддерживается, поэтому создайте класс, расширяющий счетчик и перекрывающий метод щелчка, и в этом методе делайте то, что хотите.

person Community    schedule 20.01.2012

я обнаружил, что старый выбор сохраняется в переменной с именем mOldSelectedPosition в иерархии счетчика. Spinner использует это значение, чтобы проверить, выбран ли тот же элемент или нет, и если это то же самое, он игнорирует. Если мы не хотим игнорировать это, то, что я сделал, это какой-то грязный код, использующий отражение.

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

}

Этот класс всегда будет аннулировать значение oldselection, так что каждый раз при нажатии будет срабатывать событие. Возможно, это не идеальное решение. Используйте с осторожностью. :)

person Suat KARAKUSOGLU    schedule 01.12.2012
comment
Отличное решение! Я пытался взломать это в течение нескольких часов. Спасибо! - person nathanielwolf; 06.12.2012

Надеюсь, это поможет. Я пробовал, и это работает

/** 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());
        }
      }
    }
person Eric Leong Zhia Choong    schedule 25.08.2014

Поскольку моя репутация недостаточно высока, чтобы напрямую комментировать ответ @Suat, я попробовал этот метод, он работает как шарм, но я не понимаю, какие могут быть побочные эффекты. Что-то, что я хочу добавить, это то, что следует добавить дополнительные конструкторы, чтобы избежать ошибок.

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

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

}

person ZijunLost    schedule 10.09.2013

Вы можете добавить имя метода к выбранному вами элементу METHOD

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

oBject был объявлен для счетчика

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



}
person Raghav Chopra    schedule 20.01.2012