Intereting Posts
Будет ли AlarmManager работать, если мое приложение не запущено? Будет ли таймер на Android планировать выполнять каждую вторую работу во время прыжка? В чем разница между Robolectric.setupActivity () и Robolectric.buildActivity ()? Android-ресурс Android – должен содержать символ «%» SQL-параметры в Android Получить пути к файлам миниатюр изображений Замена нити пользовательского интерфейса с помощью AsyncTask Отключить оранжевую подсветку вокруг ссылок в Android Есть ли способ заставить Eclipse автоматически очищать каждый пробег? Настройка значка навигации на Android ActionBar Android: тестирование instumentation для виджетов приложений Android: программно добавить элементы пользовательского интерфейса в представлении Вход в Facebook с правом на чтение и публикацию в android facebook SDK 4.8.0 Как получить закрытый ключ для получения подписанного файла apk в android? Андроид – просто выцветать и исчезать в анимации для просмотра

Почему OnItemSelectedListener вызывается только при изменении элемента, но не на каждом пользовательском выборе?

Я использую элементы управления spinner в приложении для Android, и я обрабатываю выбор пользователей с помощью onItemSelectedListener() . Кажется, что это работает нормально, когда производится другой выбор из текущего. Я бы хотел, при определенных условиях сбросить все прядильщики на значения по умолчанию и убедиться, что onItemSelectedListener() вызывается для всех.

Является ли это частью семантики Android, что onItemSelectedListener() вызывается только при изменении пользовательского выбора. Есть ли способ заставить onItemSelectedListener() вызываться?

По умолчанию Spinner не вызывает никаких событий, когда вы выбираете тот же элемент, что и текущий выбранный элемент. Для этого вам нужно создать собственный счетчик. См. Как я могу получить событие в Android Spinner, когда выбранный выбранный элемент снова выбран?

Если вы хотите, чтобы «onItemSelected» из Spinner был запущен, даже если выбран элемент в прядильщике / если элемент выбран, и он снова щелкнут. Затем используйте этот пользовательский класс, который расширяет spinner, это сработало для меня

Затем отредактируйте свою деятельность с прядильщиками, как это, я изменил

  static Spinner spinner1; 

в

  static NDSpinner spinner1; 

а также

  variables.spinner1 = (Spinner) findViewById(R.id.spinner1); 

в

  variables.spinner1 = (NDSpinner ) findViewById(R.id.spinner1); 

Также я изменил схему xml, где расположен счетчик

  <Spinner android:id="@+id/spinner1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/place" /> 

в

  <com.yourpackagename.NDSpinner android:id="@+id/spinner1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/place" /> 

Класс расширения Spinner:

  package com.yourpackagename; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.widget.Spinner; import android.widget.Toast; import java.lang.reflect.Field; /** Spinner extension that calls onItemSelected even when the selection is the same as its previous value. * ie This is extended "Customized class of Spinner" to get the "onItemSelected" event even if the item in the * Spinner is already selected by the user*/ 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); } 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, boolean animate) { boolean sameSelected = position == getSelectedItemPosition(); ignoreOldSelectionByReflection(); 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) { ignoreOldSelectionByReflection(); super.setSelection(position); } }