Intereting Posts
Android: как узнать, завершена ли работа? Android & iOS: как разработать для обоих? Увеличивает ли Android намерение Intent при возобновлении действия? Во время передачи файлов с использованием smack в android: java.util.concurrent.ExecutionException: ответа от клиента нет Принудительный просмотр списка не для повторного использования представлений (флажок) Android KeyStore: не удалось создать самозаверяющий сертификат, неверная строка даты Обмен файлами между телефоном Android и ПК Android: java.lang.IllegalArgumentException: недопустимый тип элемента полезной нагрузки НЕОПРЕДЕЛЕННОЕ ТОП-УРОВЕННОЕ ИСКЛЮЧЕНИЕ: com.android.dex.DexException: несколько файлов dex определяют StartActivityForResult из службы Установите профиль AVC / H.264 при кодировании видео на Android с помощью MediaCodec API Учебник для начинающих для Arduino Mega ADK Как удалить элементы из списка с помощью жестов, как в gmail Предупреждение: Игнорирование артефакта API Android com.google.android:android:4.1.1.4 Android – Как связать бесплатное приложение с версией Pro

Почему 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); } }