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

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

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

Solutions Collecting From Web of "Почему 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); } }