RecyclerView scrollToPosition 不触发 scrollListener

新手上路,请多包涵

我正在使用带有 ScrollListener 的 RecyclerView:

 mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener()
{
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState)
        {
            super.onScrollStateChanged(recyclerView, newState);
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy)
        {
            super.onScrolled(recyclerView, dx, dy);
            // Do my logic
        }
 });

当我用手指滚动时,滚动侦听器触发良好。

但是当我像那样滚动时:

 mRecyclerView.scrollToPosition(LAST_POSITION);

滚动侦听器未被触发。

原文由 David 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 879
2 个回答

这是一个已知的问题。这是由于 RecyclerView 不知道 LayoutManager 将如何处理滚动或者它是否会处理它。

在下一个版本中,如果第一个和/或最后一个子位置在布局后发生变化(这通常是调用滚动到位置的结果),您将收到对 onScrolled 的调用。

不幸的是,dx 和 dy 将为 0,因为 RecyclerView 并不真正知道布局管理器滚动处理了多少 scrollTo 请求。或者,您也可以使用 ViewTreeObserver 的滚动回调。

原文由 yigit 发布,翻译遵循 CC BY-SA 3.0 许可协议

我遇到了同样的问题并找到了解决方法,即在布局管理器中使用 smoothScrollToPosition。此方法触发滚动侦听器。所以基本上这就是我曾经拥有的:

 recyclerView.scrollToPosition(recyclerAdapter.getItemCount() - 1);

现在我改成了这样:

 recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, recyclerAdapter.getItemCount() - 1);

它对我来说很好用。

原文由 luis.mazoni 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题