событие запуска вращателя андроида при выборе того же элемента - PullRequest
11 голосов
/ 20 января 2012

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

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

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

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

    }

Метод, описанный выше, не решает мою проблему.

Ответы [ 5 ]

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

8 голосов
/ 25 августа 2014

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

/** 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());
        }
      }
    }
3 голосов
/ 10 сентября 2013

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

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

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

}

2 голосов
/ 20 января 2012

Вы можете добавить название метода к выбранному вами методу.

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



}
0 голосов
/ 20 января 2012

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

...