Intereting Posts
Android map v2 zoom, чтобы показать все маркеры Компиляция STXXL под Android NDK r8b Обрезать изображение фиксированного размера в Android Добавление цветового фильтра в Drawable изменяет все кнопки, используя тот же Drawable Загрузить изображение с url в уведомлении Android Обнаружение GPS-переключателя в телефонах Android Android.process.acore неожиданно остановился Как начать другое действие с некоторой задержкой после нажатия кнопки в android? Android Google Admob: ресурсы сервисов Google Play не найдены Поместить постоянный текст внутри EditText, который должен быть не редактируемый – Android Android: EditText в Dialog не подтягивает мягкую клавиатуру Встроенная USB-отладка на Chrome 32 не обнаруживает устройство Android: java.lang.SecurityException: для ввода в другое приложение требуется разрешение INJECT_EVENTS Ошибка Android studio 2.0: никаких изменений в развертывании Ошибка курсора Android – «убедитесь, что курсор инициализирован правильно, прежде чем доступ к данным из него …»

Нежелательные вызовы onItemSelected

У меня 36 спиннеров, которые я инициализировал некоторыми значениями. Я использовал onItemSelectedListener с ними. Как обычно, пользователь может взаимодействовать с этими прядильщиками, активируя функцию onItemSeected.

Одна из проблем заключается в том, что вызов выполняется во время init, но я нашел для него решения здесь и избегал использования глобальной переменной «count» и проверки, если count> 36, прежде чем выполнять код внутри onItemSelected.

Моя проблема заключается в следующем: у пользователя есть возможность щелкнуть по кнопке «Предыдущая», после чего мне нужно сбросить НЕКОТОРЫЕ значения счетчика.

Я попытался изменить значение count на 0, прежде чем перезапускать прядильщики, а затем сменив его на 37 после сброса, но я понял, что onItemSelected вызывается только после выполнения каждой другой функции, поэтому он называется AFTER count Изменяется до 37, даже если значения счетчика заданы, как только они будут выбраны пользователем.

Мне нужно многократно обновлять некоторые прядильщики БЕЗ стрельбы из функции onItemSelected. Может ли кто-нибудь помочь мне найти решение? Благодарю.

Solutions Collecting From Web of "Нежелательные вызовы onItemSelected"

Я нашел простое и, я думаю, элегантное решение. Использование тегов. Сначала я создал новый XML-файл под названием «теги» и ввел следующий код:

 <resources xmlns:android="http://schemas.android.com/apk/res/android"> <item name="pos" type="id" /> </resources> 

Когда я сам использую spin.setSelection(pos) , я также делаю spin.setTag(R.id.pos, pos) , поэтому я устанавливаю текущую позицию как тег.

Затем в onItemSelected я выполняю код только в том if(spin.getTag(R.id.pos) != position) , где position – это переменная положения, предоставляемая функцией. Таким образом, мой код выполняется только тогда, когда пользователь делает выбор. Поскольку пользователь сделал выбор, тег не был обновлен, поэтому после завершения обработки я обновляю тег как spin.setTag(R.id.pos, position) .

ПРИМЕЧАНИЕ. Важно использовать один и тот же адаптер во всем, или переменная «позиция» может указывать на разные элементы.

EDIT: Как отметил kaciula, если вы не используете несколько тегов, вы можете использовать более простую версию, то есть spin.setTag(pos) и spin.getTag() БЕЗ необходимости в XML-файле.

Когда используется Spinner.setSelection (position), он всегда активирует setOnItemSelectedListener ()

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

  private Boolean mIsSpinnerFirstCall = true; ... Spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { //If a new value is selected (avoid activating on setSelection()) if(!mIsSpinnerFirstCall) { // Your code goes gere } mIsSpinnerFirstCall = false; } public void onNothingSelected(AdapterView<?> arg0) { } }); 

Способ, которым я решил это, – сначала сохранить OnItemSelectedListener. Затем установите для параметра OnItemSelectedListener Spinner значение null. После установки элемента в Spinner по коду снова восстановите OnItemSelectedListener. Это сработало для меня.

См. Следующий код:

  // disable the onItemClickListener before changing the selection by code. Set it back again afterwards AdapterView.OnItemSelectedListener onItemSelectedListener = historyPeriodSpinner.getOnItemSelectedListener(); historyPeriodSpinner.setOnItemSelectedListener(null); historyPeriodSpinner.setSelection(0); historyPeriodSpinner.setOnItemSelectedListener(onItemSelectedListener);