垂直滚动Android中的RecyclerView按像素

时间:2015-05-15 09:30:57

标签: android android-recyclerview

在我的聊天应用程序中,我使用RecyclerView和LayoutManager显示聊天消息列表。我有一个用户浏览旧邮件和新邮件到达的情况。此时我想以小距离滚动聊天以确认收到新消息的用户。  我需要以像素为单位滚动我的RecyclerView。 我发现layoutManager有方法scrollVerticallyBy,

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

但我对它所需的参数感到困惑, RecyclerView.Recycler recycleler,RecyclerView.State state ,  而且我不确定它是否会完成我的工作。

换句话说,我想找到 ListView.smoothScrollBy(int distance,int duration)的重新发布;

3 个答案:

答案 0 :(得分:5)

实现这一目标的最佳方法是使用:

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);

通过这种方式,您可以确保已加载视图

答案 1 :(得分:2)

您可以使用:

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像素 flings 直到最终目标项进入视口,然后减速停止,最终目标可见。

答案 2 :(得分:0)

您可以像这样直接滚动到回收站视图的底部 smoothScroll

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