android: AbsListView.OnScrollListener SCROLL_STATE_IDLE не вызывается после SCROLL_STATE_TOUCH_SCROLL (Версия 2.1) - PullRequest
12 голосов
/ 09 июня 2010

У меня проблема с 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 в свободном состоянии.

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

Ответы [ 4 ]

5 голосов
/ 28 июля 2010

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

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

2 голосов
/ 10 сентября 2011

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

2 голосов
/ 28 мая 2011

У меня возникла похожая проблема с 2.2.

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

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

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

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

0 голосов
/ 17 февраля 2012

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

...