Представление счетчика Android: разница между setSelection (int position) и setSelection (int position, логическая анимация)?

#java #android #spinner #stack-overflow

#java #Android #счетчик #переполнение стека

Вопрос:

Я прочитал документацию, но я не совсем ее понимаю… Для чего используется параметр «animate»?

Единственное, что я заметил:

 public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
    if (savedPosition != -1)
    {
        ((Spinner) parent).setSelection(savedPosition );
        savedPosition  = -1;
        return;
    }
   //...
}
  

… отлично работает с setSelection , но приводит к бесконечному циклу / StackOverflowError с setSelection(savedPosition, true);

Мне действительно любопытно, почему это было бы так?

Комментарии:

1. Похоже, что запуск анимации вызовет событие onItemSelected, странно, что оно не запускается без анимации..

2. я почти уверен, что он запускается даже без анимации, поскольку я достигаю кода // … сразу после того, как onItemSelected был вызван первым. (Имеется в виду, что он был вызван дважды.) Возможно ли, что существует некоторая задержка по времени, в то время как для animate «savedPosition» никогда не устанавливается в -1?

3. я не знаю, почему бы вам просто не поставить «savedPosition = -1» перед setSelection()?

4. Я сделал, и ошибка фактически исчезла! 🙂 Тем не менее, все еще немного странно. ^^

Ответ №1:

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

почему вы используете savedPosition вместо position для выделения? возможно, это то, что вызывает цикл. мое предложение — попытаться сделать это с помощью position и посмотреть, не получится ли это. ваш код несколько странный..

да, как и предполагалось в комментарии, вы по какой-то причине снова вызываете метод, потому что я считаю, что анимированный setSelection делает это, когда выбор фактически установлен.

Комментарии:

1. Код выглядит странно, потому что я пропустил совсем немного. 🙂 Однако я поменял местами setSelection и savedPosition = -1 строки (поместив savedPosition в некоторую локальную переменную), и это также сработало. Я оставлю это таким образом, поскольку я не могу быть уверен, когда будет запущен новый «OnItemSelect». — в любом случае, если я хочу, чтобы пользователь не видел изменения, должен ли я использовать «setSelection(int)» или «setSelection(int, false»?

2. ну, просто используйте setSelection (int). это старый и стабильный метод (меньше шансов на какую-то глупую проблему фрагментации, которая в любом случае не должна произойти, но кто знает). когда оба они служат для одной и той же цели, я бы использовал setSelection (int).