Intereting Posts
Можно ли использовать Кинжал в проекте библиотеки? Прокручивание направления в ViewPager Как установить пользовательский шрифт в Android-устройстве Элемент, который вы запросили, недоступен для покупки – андроид в биллинге приложения Как преобразовать SpannedString в Spannable Как настроить реакцию родной андроидной библиотеки на использование npm, установленную на основе реакции? График с узлами на Android Состояние сохранения Android при изменении ориентации Метод, вызванный после выпуска Как я могу запустить командную строку FFMPEG и принять несколько каналов (видео и аудио) без блокировки на первом входе? Как определить, когда пользователь заходит на просмотр в Android Адаптация модели View Presenter для Android с вкладками Fragment Почему NotificationManagerCompat :: cancelAll () получает SecurityException? OnCreateViewHolder RecyclerView.Adapter вызывается дважды или более, несколько раз Обнаружение движения движения по сетке

Spinner: onItemSelected не вызывается, когда выбранный элемент остается тем же

У меня есть OnItemSelectedListener для моего Spinner , но он не вызывается, когда выбранный элемент совпадает с предыдущим. По-видимому, OnClickListener не является опцией для Spinner . Мне нужно поймать каждый раз, когда пользователь нажимает на элемент. Есть идеи?

Может быть, факт, что этот Spinner находится внутри ActionBar нарушает нормальное поведение?

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

Solutions Collecting From Web of "Spinner: onItemSelected не вызывается, когда выбранный элемент остается тем же"

Хорошо, я наконец нашел решение, создав собственный класс, расширяющий 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; } } 

Я выяснил эту работу вместо той, которая была предоставлена

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

Здесь немного лучше реализована:

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

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

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

Мартин

Простейшее решение:

spinner.performItemClick (вид, положение, идентификатор)

Чтобы изменить ваш счетчик, несмотря на значение последнего выбранного индекса, используйте:

 spinner.setSelection(0); 

Перед тем, как будет вызываться другой выбор

 spinner.setSelection(number); 

Таким образом, счетчик вызовет два раза событие OnItemSelected . Просто убедитесь, что во второй раз он делает все, что вам нужно.