2011-02-07 22 views
18

Esto me está volviendo loco, ya que es algo que he hecho antes, pero no puedo entender por qué no está funcionando ahora ...Android Spinner - onItemSelected/setOnItemSelectedListener no desencadenar

Tengo un menú botón, implementado de la manera habitual a través de un archivo menu.xml y el método onOptionsItemSelected con un interruptor en él, que crea y muestra un girador.

He añadido el setOnItemSelectedListener, pero parece que nunca se dispara. Aparece la rueda giratoria, selecciono una opción o la vuelvo a abrir, ni se llaman onItemSelected ni onNothingSelected.

Aquí está todo el código entre el "caso" y "devolver verdadero" de la instrucción de cambio de manejo del botón de menú. (topThis es una variable que refiere al contexto de la actividad - funciona bien para todas las demás tostadas en la aplicación)

String[] widgetModes = {"Mode 1", "Mode2"}; 
ArrayAdapter<String> widgetModeAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, widgetModes); 
widgetModeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

Spinner widgetModeSpinner = new Spinner(this); 
widgetModeSpinner.setAdapter(widgetModeAdapter); 
widgetModeSpinner.setPrompt("Choose Widget Mode"); 

widgetModeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() 
{ 
    @Override 
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    { 
     Toast.makeText(topThis, "derp", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parentView) 
    { 
     Toast.makeText(topThis, "herf", Toast.LENGTH_LONG).show(); 
    } 
}); 

widgetModeSpinner.performClick(); 

¿Alguna idea? Sospecho vagamente que el hecho de que esté creando el Spinner programáticamente es el problema ...

+0

quizás pruebe parentView.getContext()? ¿No necesita agregarlo en algún lugar a la interfaz de usuario? - esto puede significar que los eventos de interacción de IU como la selección de elementos no se pasan al Spinner. – Jems

+1

Gracias por el consejo: terminé implementando algo similar. Se agregó un spinner invisible al diseño, se movió todo, excepto el elemento performClick fuera del menú y en uno llamado en crear. Parece que se asegura de que el oyente esté "conectado" al diseño actualmente inflado, o algo así. La posición del código en relación con setContentView (R.layout.main); es importante ... – Greg

+1

Creo que el hecho de que el resto de mi código implique la reinflación ocasional del diseño (utilizando setContentView (R.layout.main);) también causa problemas ... los oyentes ya no se adjuntan si no se vuelven a configurar después de que el diseño es reinflado – Greg

Respuesta

6

Recuerde que no puede volver a seleccionar el mismo elemento giratorio, siempre establece el primer elemento como seleccionado si no está agregando un código personalizado para manejar la selección del selector.

para la tostada no mostrar, sugeriría utilizar siempre los "MyActivity.this" como su contexto al crear un pan tostado dentro de una interfaz de escucha de esta manera:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     /** 
     * Called when a new item is selected (in the Spinner) 
     */ 
     public void onItemSelected(AdapterView<?> parent, View view, 
        int pos, long id) { 
       // An spinnerItem was selected. You can retrieve the selected item using 
       // parent.getItemAtPosition(pos) 

       Toast.makeText(MyActivity.this, "Hello Toast",Toast.LENGTH_SHORT).show(); 

      } 

      public void onNothingSelected(AdapterView<?> parent) { 
       // Do nothing, just another required interface callback 
      } 

    }); // (optional) 

Y el .show() al final es fácil olvidar a veces;)

14

tuve el problema similar cuando estaba llevando a cabo un control de giro, lo resolví por conseguir la vista padre y establecer Adapter-

spinner1 =(Spinner)findViewById(R.id.spinner1); 
spinner1.setAdapter(BindSpinner("ProgramMaster",cols,null,true,"")); 
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() 
{ 
protected Adapter initializedAdapter=null; 
    @Override 
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    { 
     if(initializedAdapter !=parentView.getAdapter()) { 
      initializedAdapter = parentView.getAdapter(); 
      return; 
     } 

     String selected = parentView.getItemAtPosition(position).toString(); 

     if(abc.equals("Select") && !selected.equals("Select")) 
     { 
      do something 
     } 

     else 
     { 
      Do something 
     } 
     textQualification=selected; 
     SearchUpdated("Qualification"); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parentView) { 
     // your code here 
    } 
}); 
2

sé que la pregunta es un poco viejo, pero en caso de que usted está esperando una devolución de llamada AsyncTask, asegúrese de que usted deje que su know adaptador de los cambios de datos llamando notifyDataSetChanged() en la rosca de devolución de llamada!

@Override 
public void onPostExecute(String result) { 
    ///do something with your data 
    spinnerArrayAdapter.notifyDataSetChanged(); 
} 
+0

Gracias. Estuve cavando durante 2 horas para esto :) –

4

En realidad, si la visibilidad de su spinner se establece en ido entonces se activará el clic de que cuando se llama a performclick() método pero no va a desencadenar su setOnItemSelectedListener por lo que necesita cambiar la visibilidad entonces funcionará

Cuestiones relacionadas