12

I have a problem with android version 2.1. It looks like a bug.

I attached an OnScrollListener to my listView.

I'm using the method onScrollStateChanged(AbsListView view, int scrollState) for monitoring the scroll's state of my listview.

The scrollstate could assume 3 value (taken from the documentation):

  1. SCROLL_STATE_FLING: The user had previously been scrolling using touch and had performed a fling. The animation is now coasting to a stop
  2. SCROLL_STATE_IDLE:The view is not scrolling. Note navigating the list using the trackball counts as being in the idle state since these transitions are not animated.
  3. SCROLL_STATE_TOUCH_SCROLL:The user is scrolling using touch, and their finger is still on the screen

I assume that the SCROLL_STATE_IDLE will always be passed after one of other two states. It's always true excepted for android version 2.1. SCROLL_STATE_IDLE is not passed after SCROLL_STATE_TOUCH_SCROLL The problem happens also if you stop the fling by a touch instead of let the scroll stop by itself. This strange behaviour leaves my listView in an unconsistate state.

Someonelse has the same problem? Suggestion for a "not-so-dirty" work around?

skaffman
  • 381,978
  • 94
  • 789
  • 754
Francesco Laurita
  • 22,784
  • 7
  • 52
  • 63

4 Answers4

5

I think there is a bug that has been registered for this case.

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

DeRagan
  • 21,854
  • 6
  • 38
  • 50
2

I got a similar issue on 2.2.

If the list is big enough, and I scroll down up, I got first CROLL_STATE_TOUCH_SCROLL while my finger is on the screen. When my finger leave the screen I got the SCROLL_STATE_FLING. When my view has stopped moving I got the SCROLL_STATE_IDLE.

But, if during scroll, it reaches either View Top or Bottom, I only scroll/fling values and never the idle.

I checked out Shelves project from Romain Guy and his implementation suffer the same issue on 2.2.x I'm wondering if he had noticed yet.

I haven't tried yet with 2.3.x

fr4gus
  • 399
  • 6
  • 18
2

I found something of a workaround for this (at least for API level 9+, where I'm still seeing the bug). I'm using a GridView, but I believe this should also work for ListView.

I'm using a subclass of GridView where I am detecting the overscroll (top or bottom):

 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;
   }
 }

Then, in my OnScrollListener of CustomGridView, I have:

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

   // ...
 }

Now when I'm checking for OnScrollListener.SCROLL_STATE_IDLE, I also check if !gridView.isOverScrolled(). I'm not sure if that fixes your specific use cases, but hopefully you can use the additional piece of info to determine your current state despite the bug.

jordanti
  • 156
  • 5
0

I have had this same problem and posted a workaround on the bug list mentioned by DeRagan: Link

Kasium
  • 945
  • 10
  • 24