2012-01-20 2 views
10

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

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

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

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

    } 

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

+0

Возможный дубликат [Как я могу получить событие в Android Spinner, когда текущий выбранный элемент выбран снова?] (Http://stackoverflow.com/questions/5335306/how-can -i-get-an-event-in-android-spinner-when-the-current-selected-item-is-sele) –

ответ

0

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

2

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

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

объектного был объявлен для блесны

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



} 
18

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

+0

Отличное решение! Я пытался расправиться с этим часами. Благодаря! – nathanielwolf

+0

Хорошо. Спасибо, он решил мою проблему. –

3

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

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

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

}

6

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

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

работает как шарм на 4.4.2 =) –

Смежные вопросы