Android - Spinner: как можно отличить действия пользователя от действий компьютера в OnItemSelectedListener - PullRequest
4 голосов
/ 17 ноября 2010

У меня проблемы с управлением счетчиком, могу ли я попросить вас о помощи?

У меня есть блесна с адаптером. Я инициализирую счетчик со списком значений при запуске своей деятельности. Затем я заставляю выбранное значение быть тем, которое используется в объекте, которым я управляю.

После инициализации экрана: Когда пользователь выбирает значение в счетчике, в соответствии с выбранным значением, я могу перейти (или нет) к другой операции, чтобы позволить пользователю выбрать дополнительное и необходимое значение. Если пользователь «отменяет» это второе действие, я хочу откатить счетчик до его предыдущего выбранного значения и отменить некоторые действия, выполненные за это время. Если пользователь переходит к концу второго действия, все в порядке, и я хочу просто обновить отображение счетчика данными, выбранными во втором действии (для этого я перегружаю метод getView в адаптере).

В целом, я легко могу сделать все это, однако, когда я принудительно заставляю выбранное значение в счетчике в начале моей деятельности, или когда вы возвращаетесь из второго действия с помощью «Отмена», событие значения изменения ловится и запускается второе действие (пользователь вообще ничего не нажимал).

Как разрешить запуск второго действия только в том случае, если изменение выбранного значения в счетчике происходит из-за ручного действия пользователя, и предотвратить запуск этого же второго действия при изменении значения счетчика "в коде"?

Я испробовал множество решений, например, установил логическое значение в адаптер, который сообщает, будет ли вызвано следующее событие из-за действия «в коде». Или также добавление логического значения в адаптер, который сообщает, инициализировался ли адаптер, и я устанавливаю для этого логического значения значение true при событии первого изменения. Но ничего, что действительно хорошо работает.

Спасибо за вашу помощь.

Оливер

1 Ответ

4 голосов
/ 17 ноября 2010

Я всегда решал эту проблему с помощью логических флагов, это совсем не красиво, но работает, если вы обдумаете это.

Идея более или менее, создать глобальное пригодное для использования логическое значение и инициализировать с помощью false , в onSelectedItemListener () использовать это логическое значение, чтобы выбрать более или менее активировать действие, важно помнить о том, что необходимо установить значение true после того, как компьютер выбрал его автоматически в первый раз, и сбросить значение false в методе onResume ().

Это не идеально, но должно работать.

Edit:

bool spinnerUsable1;
bool spinnerUsable2;
int positionSpinner;

public void onCreate(Bundle savedInstanceState){
   spinnerUsable1 = false;
   spinnerUsable2 = true;
   if(savedInstanceState != null){
      positionSpinner = savedInstanceState.getInt("posSpinner");
      if(positionSpinner != 0) spinnerUsable2 = false;
   }

   //Declare your spinner, set the on item selected lister
   spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                boolean spinnerUsable = (spinnerUsable1 && spinnerUsable2);
                if (!spinnerUsable1) {
                    spinnerUsable1 = true;
                } else if (!spinnerUsable2) {
                    spinnerUsable2 = true;
                }
                if (spinnerUsable) {
                    //Action;
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // Nothing
            }
        });
}

Нечто подобное должно работать.

...