Spinner: onItemSelected no se llama cuando el elemento seleccionado permanece igual

Tengo un OnItemSelectedListener para mi Spinner , pero no se llama cuando el elemento seleccionado es el mismo que el anterior. Aparentemente, el OnClickListener no es una opción para un Spinner . Necesito coger cada vez que un usuario haga clic en un elemento. ¿Alguna idea?

Tal vez el hecho de que este Spinner está dentro de la ActionBar perturba el comportamiento normal?

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.tracklist_menu, menu); Spinner spinner = (Spinner) menu.findItem(R.id.option_ordering_spinner) .getActionView(); spinner.setAdapter(mSpinnerAdapter); spinner.setSelection(PrefsHelper.getOrderingSpinnerPos(prefs)); spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String str = "selected"; System.out.println(str); if (optionMenuInitialized) { switch (position) { case 0: // rdm getActivity() .sendBroadcast( new Intent( MyIntentAction.DO_RESHUFFLE_PLAYLIST)); smp.setCurrentTracklistCursorPos(-1); trackAdapter.notifyDataSetChanged(); break; case 1: // artist getActivity() .sendBroadcast( new Intent( MyIntentAction.DO_ORDER_PLAYLIST_BY_ARTIST)); smp.setCurrentTracklistCursorPos(-1); trackAdapter.notifyDataSetChanged(); break; case 2: // folder getActivity() .sendBroadcast( new Intent( MyIntentAction.DO_ORDER_PLAYLIST_BY_FOLDER)); smp.setCurrentTracklistCursorPos(-1); trackAdapter.notifyDataSetChanged(); break; } PrefsHelper.setOrderingSpinnerPos(prefEditor, position); prefEditor.commit(); } optionMenuInitialized = true; } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } 

Ok, finalmente encontré una solución, al crear mi propia clase extendiendo Spinner:

 public class MySpinner extends Spinner { OnItemSelectedListener listener; public MySpinner(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void setSelection(int position) { super.setSelection(position); if (listener != null) listener.onItemSelected(null, null, position, 0); } public void setOnItemSelectedEvenIfUnchangedListener( OnItemSelectedListener listener) { this.listener = listener; } } 

Descubrí este trabajo en lugar del que se proporcionó

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

Aquí una implementación un poco mejor:

 public class SpinnerPlus extends Spinner { AdapterView.OnItemSelectedListener listener; public SpinnerPlus(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void setSelection(int position) { super.setSelection(position); if (listener != null) listener.onItemSelected(this, getSelectedView(), position, 0); } public void setOnItemSelectedEvenIfUnchangedListener( AdapterView.OnItemSelectedListener listener) { this.listener = listener; } } 

Si sigue siendo real, la llamada correcta de la devolución de llamada debe ser

 @Override public void setSelection(int position) { super.setSelection(position); if(listener != null) listener.onItemSelected(this, getChildAt(position), position, 0); } 

Martín

La solución más simple:

Spinner.performItemClick (vista, posición, id)

Para hacer que su rotonda cambie a pesar del valor del último índice seleccionado, simplemente use a:

 spinner.setSelection(0); 

Antes de que su otra selección se llama

 spinner.setSelection(number); 

De esta manera, la ruleta desencadenará dos veces el evento OnItemSelected . Sólo asegúrese de que la segunda vez que hace lo que necesita.

  • ¿Cómo puedo añadir mi spinner a la ActionBar?
  • Android Cambiar hilandero color pulsado Luz Holo tema
  • Spinner Tamaño Pequeño
  • ¿Diversas vistas para el artículo del hilandero y del hilandero?
  • Android Spinner dropDownHorizontalOffset no funciona pero dropDownVerticleOffest es
  • Configuración del Adaptador del Spinner de Android en el hilador
  • Alternativa a la CLASE SPINNER ALTAMENTE FLAWED en Android
  • ¿Cómo puedo utilizar spinner setOnItemLongClickListener
  • Spinner onItemSelected llamado erróneamente (sin acción del usuario)
  • Establecer TextSize a un texto en spinner en android programatically
  • Implementación de eventos Spinner with Butter Knife
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.