Подтвердить что ты не робот

Android: AbsListView.OnScrollListener SCROLL_STATE_IDLE не вызывается после SCROLL_STATE_TOUCH_SCROLL (версия 2.1)

У меня проблема с версией Android 2.1. Это похоже на ошибку.

Я прикрепил OnScrollListener к моему спискуView.

Я использую метод onScrollStateChanged(AbsListView view, int scrollState) для контроля состояния прокрутки моего списка.

Число прокрутки может принимать 3 значения (взятые из документации):

  • SCROLL_STATE_FLING. Пользователь имел ранее выполнялась прокрутка с использованием прикоснулся и сделал бросок. анимация теперь останавливается до остановки.
  • SCROLL_STATE_IDLE: представление не прокрутки. Примечание. Навигация по списку использование трекбола считается в свободном состоянии, поскольку эти переходы не анимированы.
  • SCROLL_STATE_TOUCH_SCROLL: пользователь прокручивается с помощью касания, а их палец все еще находится на экране

Я предполагаю, что SCROLL_STATE_IDLE всегда будет передаваться после одного из двух других состояний. Это всегда верно, за исключением версии для Android версии 2.1. SCROLL_STATE_IDLE не передается после SCROLL_STATE_TOUCH_SCROLL Проблема также возникает, если вы остановите бросок прикосновением, а не пропустите прокрутку самостоятельно. Это странное поведение оставляет мой listView в неконсолидированном состоянии.

У кого-то есть такая же проблема? Предложение об "не-грязной" работе?

4b9b3361

Ответ 2

Я получил аналогичную проблему в версии 2.2.

Если список достаточно большой, и я прокручиваю вниз, я получил сначала CROLL_STATE_TOUCH_SCROLL, пока мой палец находится на экране. Когда мой палец покинул экран, я получил SCROLL_STATE_FLING. Когда мое представление остановилось, я получил SCROLL_STATE_IDLE.

Но, если во время прокрутки он достигает либо "Вид сверху", либо "Нижний", я только прокручиваю/переворачиваю значения и никогда не простаиваю.

Я проверил проект Shelves от Romain Guy, и его реализация страдает той же проблемой на 2.2.x Мне интересно, заметил ли он еще.

Я еще не пробовал с 2.3.x

Ответ 3

Я нашел кое-что обходное решение для этого (по крайней мере для уровня API 9+, где я все еще вижу ошибку). Я использую GridView, но я считаю, что это также должно работать для ListView.

Я использую подкласс GridView, где я обнаруживаю прокрутку (сверху или снизу):

 public class CustomGridView {
   private boolean mIsOverScrolled = false;

   @Override
   protected void onOverScrolled(int scrollX, int scrollY, 
                       boolean clampedX, boolean clampedY) {
     mIsOverScrolled = true;
     super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
   }

   public boolean isOverScrolled() {
     return mOsOverScrolled;
   }

   public void clearOverScroll() {
     mIsOverScrolled = false;
   }
 }

Затем в моем OnScrollListener из CustomGridView у меня есть:

 @Override
 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                             int totalItemCount) {
   if (gridView.isOverScrolled()) {
     gridView.clearOverScroll();
   }

   // ...
 }

Теперь, когда я проверяю OnScrollListener.SCROLL_STATE_IDLE, я также проверяю, есть ли !gridView.isOverScrolled(). Я не уверен, что это исправляет ваши конкретные варианты использования, но, надеюсь, вы можете использовать дополнительную информацию для определения вашего текущего состояния, несмотря на ошибку.

Ответ 4

У меня была такая же проблема и выложил обходной путь в списке ошибок, упомянутом DeRagan: Ссылка