在Android中按像素垂直滚动RecyclerView

10

在我的聊天应用程序中,我使用RecyclerViewLayoutManager来显示聊天消息列表。当用户浏览旧消息并收到新消息时,我希望滚动聊天以提示用户已收到新消息。我需要按像素距离滚动RecyclerView

我发现LayoutManager有一个scrollVerticallyBy()方法。

public int scrollVerticallyBy (int dy, RecyclerView.Recycler recycler, RecyclerView.State state)

但是我被它需要的参数所困惑,RecyclerView.Recycler recyclerRecyclerView.State state,并不确定它是否能胜任我的工作。

换句话说,我想找到替代ListView.smoothScrollBy(int distance, int duration)的方法。

3个回答

11

实现这一目标的最佳方法是使用以下代码:

recyclerView.smoothScrollBy(0, 100);

这是该方法的签名。您可以在x轴和y轴上滚动:

public void smoothScrollBy(int dx, int dy)

注意:如果smothScrollBy(dx,dy)无法正常工作,则是由于RecyclerView尚未加载其元素。为此,我建议使用:

new Handler().postDelayed(new Runnable() {
  @Override public void run() {
    recyclerView.smoothScrollBy(0, 100);
  }
}, 200);

这样做,您可以确保视图已加载


如果我不想要平滑滚动,而是想直接将其滚动到该轴点,那么我在这种情况下应该使用什么?RecyclerView.scrollBy()似乎不起作用。 - Sagar
@Sagar,你检查过在调用该方法时元素是否已经被加载了吗?请按照我的答案末尾的建议去做。 - Antonio
1
谢谢,那很有帮助! - Sagar

1

您可以使用:

recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount());

如果有相关职位。
 recyclerView.smoothScrollToPosition(0);

参考资料: http://blog.stylingandroid.com/scrolling-recyclerview-part-1/

    @Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
        int position) {
    LinearSmoothScroller linearSmoothScroller =
            new LinearSmoothScroller(recyclerView.getContext()) {
                @Override
                public PointF computeScrollVectorForPosition(int targetPosition) {
                    return LinearLayoutManager.this
                            .computeScrollVectorForPosition(targetPosition);
                }
            };
    linearSmoothScroller.setTargetPosition(position);
    startSmoothScroll(linearSmoothScroller);
}

LinearSmoothScroller是负责执行实际滚动的实例。这不是一个简单的类 - 它包含了大量的逻辑。然而,它实现的行为相当简单易懂。它不会尝试确定在到达终点之前需要滚动多少像素,而是以每英寸25毫秒的速度执行一系列10000像素的快速滑动,直到最终目标项进入视口,然后减速停止,使最终目标可见。


6
我想通过距离滚动列表,而不是滚动到列表的末尾或开头。 - Rafael
我修改了我的回答,这是你可以使用的最佳像素格式。 - NovusMobile
例如,我有一个包含100条消息的列表,并且我在列表的中间某个位置。我想向下滚动一条消息,我该如何使用您的代码? - Rafael
阅读此URL的第二部分。您的问题已经在那里得到回答了。 - NovusMobile
我认为我们可以使用其他方式通知用户有新消息,而不是通过滚动一小段距离。 - Rafael
显示剩余4条评论

0

您可以直接滚动到 Recycler View 的底部,而无需使用 smoothScroll

/* Method to set the recycler view focus to bottom */
private void scrollToBottom() {
    mRecyclerView.scrollToPosition(mAdapter.getItemCount() - 1);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接