Событие пожаротушения андроида при создании одного и того же элемента

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

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

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

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

    }

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

Ответ 1

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

Ответ 2

Я обнаружил, что старый выбор хранится в переменной 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, так что каждый раз при нажатии на событие click срабатывает. Это может быть не идеальное решение. Используйте с осторожностью.:)

Ответ 3

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

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

Ответ 4

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

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

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

}

Ответ 5

Вы можете добавить имя метода в свой выбранный элемент МЕТОД

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

oBject объявлен для 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();
        }



}