Как отключить onItemSelectedListener, который будет вызван при установке выбранного пункта кодом

Просто удивление, как Вы решаете следующую проблему: результат вычисляется в зависимости от выбранных пунктов двух счетчиков. Обработать вещи UI, т.е. пользователя выбирает новый объект в одном из счетчиков, я устанавливаю слушателя, использующего setOnItemSelectedListener для счетчика в моем onCreate() метод действия.

Теперь: это работает, конечно, прекрасный. Работа слушателя должна инициировать новое вычисление результата.

Проблема: потому что я прерываю onPause() onResume() для сохранения/восстанавливания последнего состояния я получил метод, который устанавливает выбранный пункт этих двух счетчиков программно как в здесь:

startSpinner.setSelection(pStart);
destSpinner.setSelection(pDest);

Эти два вызова вызывают слушателей, также! Мой метод расчета для результата плюс уведомление о новом наборе результатов вызывается дважды здесь!

Глупый прямой подход для этого должен был бы иметь логическую переменную, отключающую независимо от того, что слушатель делает внутри, устанавливая его прежде, чем установить выбранные пункты и сбросить его впоследствии. Хорошо. Но есть ли лучший метод??

Я не хочу, чтобы слушателям позвонил код - действия, только пользовательскими действиями!:-(

Как дела это? Спасибо!

33
задан Zordid 19 February 2010 в 15:55
поделиться

2 ответа

Добавьте OnItemSelectedListener для каждого спиннера после установки предыдущего значения в onResume.

1
ответ дан 27 November 2019 в 17:57
поделиться

Хорошо, у меня все работает так, как я хочу сейчас.

Дело в том, чтобы понять здесь (а я этого не делал, когда писал этот вопрос...), что все в Android работает в одном потоке - потоке пользовательского интерфейса.

Значение: несмотря на то, что вы устанавливаете значения Спиннера здесь и там: они только обновляются (визуально) и их слушатели вызываются только после того, как закончены все методы, в которых вы находитесь в данный момент (например, onCreate , onResume или что угодно).

Это позволяет следующее:

  • сохранить выбранные позиции в переменных поля. (как currentPos1 , currentPos2 )
  • прослушиватели onItemSelectedListener () вызывают метод, такой как refreshMyResult () , или любой другой.
  • при программном задании позиций установите вращатели и вызовите собственный метод обновления вручную сразу после этого.

Метод refreshMyResult () выглядит так:

int newPos1 = mySpinner1.getSelectedItemPosition();
int newPos2 = mySpinner2.getSelectedItemPosition();
// only do something if update is not done yet
if (newPos1 != currentPos1 || newPos2 != currentPos2) {
    currentPos1 = newPos1;
    currentPos2 = newPos2;

    // do whatever has to be done to update things!

}

Поскольку прослушиватели будут вызваны позже - и к тому времени запомненная позиция в currentPos уже обновлена - ничего не произойдет и не произойдет ненужного обновления ничего другого. Когда пользователь выбирает новое значение в одном из спиннеров, хорошо - обновление будет выполнено соответствующим образом!

Все!: -)

Ах - еще одно: ответ на мой вопрос: Нет. Прослушиватели не могут быть отключены (легко) и будут вызываться при каждом изменении значения.

11
ответ дан 27 November 2019 в 17:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: