Просто удивление, как Вы решаете следующую проблему: результат вычисляется в зависимости от выбранных пунктов двух счетчиков. Обработать вещи UI, т.е. пользователя выбирает новый объект в одном из счетчиков, я устанавливаю слушателя, использующего setOnItemSelectedListener
для счетчика в моем onCreate()
метод действия.
Теперь: это работает, конечно, прекрасный. Работа слушателя должна инициировать новое вычисление результата.
Проблема: потому что я прерываю onPause()
onResume()
для сохранения/восстанавливания последнего состояния я получил метод, который устанавливает выбранный пункт этих двух счетчиков программно как в здесь:
startSpinner.setSelection(pStart);
destSpinner.setSelection(pDest);
Эти два вызова вызывают слушателей, также! Мой метод расчета для результата плюс уведомление о новом наборе результатов вызывается дважды здесь!
Глупый прямой подход для этого должен был бы иметь логическую переменную, отключающую независимо от того, что слушатель делает внутри, устанавливая его прежде, чем установить выбранные пункты и сбросить его впоследствии. Хорошо. Но есть ли лучший метод??
Я не хочу, чтобы слушателям позвонил код - действия, только пользовательскими действиями!:-(
Как дела это? Спасибо!
Добавьте OnItemSelectedListener
для каждого спиннера после установки предыдущего значения в onResume
.
Хорошо, у меня все работает так, как я хочу сейчас.
Дело в том, чтобы понять здесь (а я этого не делал, когда писал этот вопрос...), что все в 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 уже обновлена - ничего не произойдет и не произойдет ненужного обновления ничего другого. Когда пользователь выбирает новое значение в одном из спиннеров, хорошо - обновление будет выполнено соответствующим образом!
Все!: -)
Ах - еще одно: ответ на мой вопрос: Нет. Прослушиватели не могут быть отключены (легко) и будут вызываться при каждом изменении значения.