Android 2.1版本中,当SCROLL_STATE_TOUCH_SCROLL发生后,AbsListView.OnScrollListener的SCROLL_STATE_IDLE没有被调用。

12
我遇到了Android版本2.1的问题,看起来像是一个错误。我在我的listView上附加了一个OnScrollListener。我使用方法onScrollStateChanged(AbsListView view, int scrollState)来监视listView的滚动状态。根据文档,滚动状态可以有3个值:
1. SCROLL_STATE_FLING:用户之前使用触摸进行滚动并执行了fling(快速滑动),现在动画正在缓慢停止。 2. SCROLL_STATE_IDLE:视图没有滚动。请注意,使用轨迹球导航列表计为处于空闲状态,因为这些转换没有动画效果。 3. SCROLL_STATE_TOUCH_SCROLL:用户正在使用触摸滚动,并且他们的手指仍在屏幕上。
我认为SCROLL_STATE_IDLE将始终在其他两个状态之后传递。除了Android 2.1,这总是正确的。在SCROLL_STATE_TOUCH_SCROLL之后不会传递SCROLL_STATE_IDLE。如果你用手触碰而不是让滚动自己停止来停止fling,则会出现问题。这种奇怪的行为使得我的listView处于不一致的状态。是否有人遇到了同样的问题?建议使用“不那么糟糕”的解决方法?
4个回答

5

2

我发现了一个解决方法(至少对于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;
   }
 }

然后,在我的CustomGridView的OnScrollListener中,我有以下代码:
 @Override
 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                             int totalItemCount) {
   if (gridView.isOverScrolled()) {
     gridView.clearOverScroll();
   }

   // ...
 }

现在当我检查OnScrollListener.SCROLL_STATE_IDLE时,我还会检查!gridView.isOverScrolled()。我不确定这是否修复了您特定的用例,但希望您可以使用额外的信息来确定您的当前状态,尽管存在此错误。


2

我在2.2版本上遇到了类似的问题。

如果列表足够长,并且我向上滚动,当我的手指在屏幕上时,我会先得到CROLL_STATE_TOUCH_SCROLL。当我的手指离开屏幕时,我会得到SCROLL_STATE_FLING。当我的视图停止移动时,我会得到SCROLL_STATE_IDLE。

但是,如果在滚动过程中,它达到视图顶部或底部,我只会得到滚动/飞快的值,而从未出现空闲状态。

我查看了Romain Guy的Shelves项目和他的实现在2.2.x上也存在同样的问题,我想知道他是否已经注意到这一点。

我还没有尝试过2.3.x。


0

我曾经遇到过这个问题,并在DeRagan提到的错误列表上发布了一个解决方法: 链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接