【问题标题】:Android smoothScrollTo not invoking onScrollStateChangedAndroid smoothScrollTo 不调用 onScrollStateChanged
【发布时间】:2011-09-28 15:35:34
【问题描述】:

我正在使用smoothScrollBy() 滚动到ListView 中的特定位置。我希望在 ListView 完成滚动以将其与用户用手指滚动时触发的当前 onScrollStateChanged() 事件集成时收到通知。

目前我正在使用Timer,它在平滑滚动持续 100 毫秒后运行,但这不像我希望的那样由事件驱动。

【问题讨论】:

  • 我可以通过自己的调试确认smoothScroll* 函数不会触发滚动状态更改,因此会使OnScrollListener.onScrollStateChanged() 回调无效。

标签: android listview scroll event-driven


【解决方案1】:

如果您已经为您的列表视图实现了 OnScrollListener,您可以观察 ScrollState 何时发生变化。在调用 smoothScrollBy() 时使用全局布尔值 (isScrolling) 设置为 true,然后在 OnScrollListener 注册 SCROLL_STATE_IDLE 的 ScrollState 时将其设置为 false。

sidebar1.smoothScrollToPositionFromTop(currentPosition, 0, 500);
isScrolling = true;

sidebar1.setOnScrollListener(new OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
        isScrolling = false;
    }

}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {

}
});

【讨论】:

  • 不幸的是 smoothScrollToPositionFromTop 在 API 11 中出现。
  • 没错,但您不只是希望在滚动完成时收到通知吗?您应该能够使用 smoothScrollBy 并将侦听器与持续轮询 isScrolling 状态的 while 循环结合使用。
  • 根据我的经验,smoothScrollBy() 不会调用 onScrollStateChanged(),并且到目前为止,我正在使用 Timer 在滚动完成后进行轮询。
  • 另一个想法是轮询并检查 getLastVisiblePosition() 一旦发生变化然后保持一致,您可能可以确定滚动已停止。它不是真正的事件驱动,但应该可以很好地完成工作。
  • 在 Galaxy Tab 10.1 (Android 3.1) 上,smoothScrollBy 确实会触发对 onScrollStateChanged 的​​调用。这很可能也发生在华为 Media PadS7 - 301u (Android 3.2) 上。在 2.x 版本中,afaik,smoothScrollBy 触发 onScrollStateChanged
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多