2010-06-09 31 views
12

我有一个Android版本2.1的问题。它看起来像一个错误。android:AbsListView.OnScrollListener SCROLL_STATE_IDLE不会在SCROLL_STATE_TOUCH_SCROLL(版本2.1)后调用

我附加了一个OnScrollListener到我的listView。

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

的scrollstate可以假设3值(从文档获取):

  1. SCROLL_STATE_FLING:用户已经 先前已被使用 触摸滚动,并进行扫视。 动画现在正在滑行到停止
  2. SCROLL_STATE_IDLE:视图不是 滚动。请注意,在空闲状态下,使用轨迹球计数为 导航列表 ,因为这些 转场没有动画。
  3. SCROLL_STATE_TOUCH_SCROLL:用户 使用触控滚动和他们的 手指还在屏幕

我假设SCROLL_STATE_IDLE永远其他两种状态后通过。 除了android版本2.1之外,它总是如此。 SCROLL_STATE_IDLESCROLL_STATE_TOUCH_SCROLL 之后未通过如果您通过触摸停止投掷,而不是让滚动自行停止,问题也会发生。 这个奇怪的行为使我的listView处于不一致的状态。

Someonelse有同样的问题? 对“不太脏”工作的建议?

+0

它没有最后落实? – st0le 2011-05-11 10:46:08

回答

2

我得到了2.2类似的问题。

如果列表足够大,向下滚动,我的手指在屏幕上时,首先获得了CROLL_STATE_TOUCH_SCROLL。当我的手指离开屏幕时,我得到了SCROLL_STATE_FLING。当我的视图停止移动时,我得到了SCROLL_STATE_IDLE。但是,如果在滚动期间,它会到达View Top或Bottom,我只会滚动/拖动值,而不会空闲。

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

我还没有2.3.x版本

2

我发现了一个解决办法的这个东西(至少对于API级别9+,在那里我仍然看到的bug)还没试过。我正在使用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()。我不确定这是否能解决您的具体使用案例,但希望您可以使用附加信息来确定您的当前状态,尽管存在该错误。

0

我有同样的问题,并发表DeRagan提到的bug列表上的解决方法: Link

相关问题