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

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

Я привязал OnScrollListener к моему списку.

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

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

  1. SCROLL_STATE_FLING : Пользователь ранее прокручивал с помощью касания и выполнял бросок. Теперь анимация останавливается до остановки
  2. SCROLL_STATE_IDLE : представление не прокручивается. Обратите внимание на навигацию по списку, используя подсчет трекбола как находящийся в состоянии ожидания, поскольку эти переходы не анимируются.
  3. SCROLL_STATE_TOUCH_SCROLL : пользователь выполняет прокрутку с помощью касания, а их палец все еще отображается на экране

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

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

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

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

http://code.google.com/p/android/issues/detail?id=5086

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

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

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

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

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

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

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

  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() . Я не уверен, что это фиксирует ваши конкретные варианты использования, но, надеюсь, вы можете использовать дополнительную информацию, чтобы определить свое текущее состояние, несмотря на ошибку.

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