2010-09-03 10 views
6

Parece que la clase Spinner de android (y posiblemente ListView en general, aunque no estoy seguro) llama al método onItemSelected() de OnItemSelectedListener después de llamar al setAdapter(), incluso si el usuario no ha seleccionado nada explícitamente.¿Cómo evitar que el spinner de Android invoque itemselectedlistener al configurar el adaptador?

Veo cómo esto podría ser útil en muchas situaciones, pero a veces solo quiero llamar a onItemSelected() cuando un elemento se selecciona específicamente.

¿Hay alguna forma de controlar este comportamiento y hacer que Spinner NO llame al onItemSelected() después de configurar el adaptador?

Respuesta

4

No he utilizado esta solución por mucho tiempo aún así que no estoy totalmente seguro de que funciona como se esperaba, pero he tenido suerte hasta ahora con esta solución:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     protected Adapter initializedAdapter = null; 

     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

      // Always ignore the initial selection performed after setAdapter 
      if(initializedAdapter !=parent.getAdapter()) { 
       initializedAdapter = parent.getAdapter(); 
       return; 
      } 

      ... 
     } 
    } 

¿Existe una ¿mejor manera?

+2

Si el usuario presiona el primer elemento de la el código anterior no tiene ningún efecto. – matheuslf

+0

El mismo problema que estoy enfrentando – theLazyFinder

0

He utilizado los métodos setTag y getTag, y he creado un resource id llamado "spinnerstate".

Luego, cada vez que configuro programáticamente el adaptador, configuro la etiqueta "spinnerstate" en "init", y en el evento disparado, lo puse en "listo" e ignoro el evento. (Tenga en cuenta mi código es Mono para Android SE IT tendrá un aspecto diferente):

juego de adaptadores:

profileSpn.SetTag (Resource.Id.spinnerstate, "init"); 
profileSpn.Adapter = new ArrayAdapter (this, Android.Resource.Layout.SimpleSpinnerItem, items.ToArray()); 

artículo evento Seleccionado:

string state = (string)((Spinner)sender).GetTag (Resource.Id.spinnerstate); 
    if (state == "init") { 
     ((Spinner)sender).SetTag (Resource.Id.spinnerstate, "ready"); 
     return; 
    } 

estoy de acuerdo que este no es el comportamiento deseado en casi 100% de los casos, y no creo que sea un buen diseño por parte de Google, pero ahí lo tienes.

2

Añadir al oyente spinner, como a continuación:

spinner.post(new Runnable(){ 
    public void run() 
    { 
     spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

       ... 
      } 
     } 
    } 
}); 
0

hice cosas similares antes, que utilizan el valor de conteo. El uso del objeto adaptador primario está incompleto porque puede ser un problema cuando se actualiza la vista o se vuelve a llamar al getView().

Por lo tanto, lo recomiendo usando una matriz de contador.

Al principio, defina la matriz de conteo en el adaptador de forma global.

private int isInitializedView[]; 

Y luego inícielo en getView().

isInitializedView[position] = 0; 

En el oyente de selección, haga algo que desee si ya se ha inicializado.

holder.mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { 
      isInitializedView[position]++; 
      if(isInitializedView[position] > 1) { 
       // do someting that you want 
      } 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parentView) {} 
    }); 

(Tenga en cuenta que isInitializedView[position]++; puede venir después de if() rutina, y sólo evento de disparo cuando este valor es >0. Es su elección.)

0

tuve tres spinner en mi actividad y todos los datos del adaptador spinner tiene llenado en el tiempo de ejecución (a partir de los datos del servicio web después de la llamada del método onCreate).Por lo tanto, llama automáticamente al método onItemSelected(AdapterView<?> parent, View view, int position, long id) de la ruleta. He resuelto este problema utilizando onUserInteraction() método de actividad marque este método que el usuario está interactuando con spinner o no. Si sí, entonces realizar la acción demás no

  1. Declarar isUserIntract variable booleana globalmente

  2. en uso onItemSelected método siguiente procedimiento

    Si (isUserIntract) {

    // realizar Acción

    } else {

    // no realizar la acción

    } uso

  3. continuación Código de la actividad

@ Override

public void onUserInteraction() { 
super.onUserInteraction(); 
isUserIntract = true; 
} 
Cuestiones relacionadas