android:AbsListView.OnScrollListener在SCROLL_STATE_TOUCH_SCROLL(版本2.1)之后不调用SCROLL_STATE_IDLE

时间:2010-06-09 12:41:08

标签: android listview android-sdk-2.1

我的Android 2.1版有问题。它看起来像一个bug。

我将OnScrollListener附加到我的listView。

我正在使用方法onScrollStateChanged(AbsListView view, int scrollState)来监控我的列表视图的滚动状态。

scrollstate可以假设3个值(取自文档):

  1. SCROLL_STATE_FLING :用户有 之前一直在滚动使用 触摸并表演了一次。该 动画现在正在停止
  2. SCROLL_STATE_IDLE :视图不是 滚动。注意导航列表 使用轨迹球计为 因为这些在空闲状态 转换不是动画。
  3. SCROLL_STATE_TOUCH_SCROLL :用户 正在滚动使用触摸和他们的 手指还在屏幕上
  4. 我假设 SCROLL_STATE_IDLE 将始终在其他两个状态之一后传递。 对于Android 2.1版来说,它总是如此。 SCROLL_STATE_TOUCH_SCROLL 后未传递 SCROLL_STATE_IDLE 如果您通过触摸停止投掷而不是让滚动自行停止,也会出现问题。 这种奇怪的行为使我的listView处于一种无法处理的状态。

    Someonelse有同样的问题吗? 建议“不那么脏”的工作?

4 个答案:

答案 0 :(得分:5)

我认为此案件已经注册了一个错误。

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

答案 1 :(得分:2)

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

如果列表足够大,我向下滚动,当我的手指在屏幕上时,我得到第一个CROLL_STATE_TOUCH_SCROLL。当我的手指离开屏幕时,我得到了SCROLL_STATE_FLING。当我的视图停止移动时,我得到了SCROLL_STATE_IDLE。

但是,如果在滚动期间,它会到达“查看顶部”或“底部”,我只会滚动/投掷值而不会空闲。

我查看了Romain Guy的Shelves项目,他的实现在2.2.x上遇到了同样的问题我想知道他是否注意到了。

我还没有尝试过2.3.x

答案 2 :(得分: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()。我不确定这是否能修复您的特定用例,但希望您可以使用额外的信息来确定您当前的状态,尽管存在错误。

答案 3 :(得分:0)

我遇到了同样的问题,并在DeRagan提到的错误列表上发布了一个解决方法: Link