2012-01-20 12 views
10

Quiero disparar un evento cuando se selecciona el mismo elemento en spinner. Métodoevento de disparo spinner de android cuando se hace la misma selección de elemento

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

se invoca solo cuando hacemos una selección diferente. Mi propósito es mostrar un brindis cuando se selecciona un elemento, ya sea que se vuelva a seleccionar el mismo elemento o se realice una selección diferente.

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

    } 

método anterior no resuelve mi problema.

+0

duplicado posible de [¿Cómo puedo obtener un evento en Android Spinner cuando el elemento seleccionado en ese momento se selecciona otra vez?] (Http://stackoverflow.com/questions/5335306/how-can -i-get-an-event-in-android-spinner-when-the-current-selected-item-is-sele) –

Respuesta

0

uso detector de clics para cumplir su requisito. como el oyente de clics directo en el spinner no es compatible, conviene hacer una clase extender spinner y sobre andar en el método click y en este método hacer lo que quiera hacer.

2

se puede añadir un nombre de método en su elemento seleccionado MÉTODO

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

objeto ha sido declarado para 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(); 
     } 



} 
18

he encontrado que la selección anterior se mantiene en la variable llamada mOldSelectedPosition en la jerarquía de la ruleta. Spinner está usando este valor para verificar si el mismo elemento se seleccionó o no, y si es el mismo, lo ignora. Si no queremos ignorar esto, lo que hice fue un código sucio usando la reflexión.

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

} 

Esta clase invalidará siempre el valor oldselection, de modo que cada vez que se active el evento click se active. Puede que no sea la solución perfecta. Usar con precaución. :)

+0

¡Gran solución! He estado tratando de descifrar esto por horas. ¡Gracias! – nathanielwolf

+0

Bueno. Gracias solucionó mi problema. –

3

Como mi reputación no es lo suficientemente alta como para comentar directamente la respuesta de @Suat, probé ese método, funciona como el hechizo, pero no tengo claro cuáles podrían ser los efectos secundarios. Algo que quiero agregar es que se deben agregar constructores adicionales para evitar errores.

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

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

}

6

Esperemos que esto ayuda. Yo probé y funciona

/** 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

trabajando como un encanto en 4.4.2 =) –

Cuestiones relacionadas