12

我对 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

4 回答 4

5

我认为这个案例已经注册了一个错误。

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

于 2010-07-28T13:00:22.203 回答
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,我也会检查 if !gridView.isOverScrolled()。我不确定这是否修复了您的特定用例,但希望您可以使用附加信息来确定您当前的状态,尽管存在错误。

于 2011-09-10T01:37:06.497 回答
2

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

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

但是,如果在滚动期间,它到达视图顶部或底部,我只滚动/翻转值,而不是空闲。

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

我还没有尝试过 2.3.x

于 2011-05-27T21:31:42.563 回答
0

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

于 2012-02-17T16:42:15.903 回答