我正在寻找一种方法来滚动RecyclerView,以显示选中的项目在顶部。

在一个ListView中,我能够通过使用scrollTo(x,y)来做到这一点,并获得需要居中的元素的顶部。

喜欢的东西:

@Override
public void onItemClick(View v, int pos){
    mylistView.scrollTo(0, v.getTop());
}

问题是RecyclerView在使用它的scrollTo方法时返回一个错误说

RecyclerView不支持滚动到绝对位置

我如何滚动一个RecyclerView把选定的项目放在视图的顶部?


当前回答

如果你的LayoutManager是LinearLayoutManager,你可以使用scrollToPositionWithOffset(position,0);它会让你的项目成为列表中第一个可见的项目。否则,你可以直接在RecyclerView上使用smoothscrolltopposition。

我最终使用了下面的代码。

 RecyclerView.LayoutManager layoutManager = mainList.getLayoutManager();
        if (layoutManager instanceof LinearLayoutManager) {
            // Scroll to item and make it the first visible item of the list.
            ((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(position, 0);
        } else {
            mainList.smoothScrollToPosition(position);
        }

其他回答

你只需要调用recyclerview. scrolltopposition (position)。这很好!

如果你想在适配器中调用它,只需让你的适配器拥有recyclerview的实例或包含recyclerview的活动或片段,然后在它们中实现getRecyclerview()方法。

我希望它能帮助你。

我使用下面的代码将一个项目(thisView)平滑滚动到顶部。 它也适用于GridLayoutManager不同高度的视图:

View firstView = mRecyclerView.getChildAt(0);
int toY = firstView.getTop();
int firstPosition = mRecyclerView.getChildAdapterPosition(firstView);
View thisView = mRecyclerView.getChildAt(thisPosition - firstPosition);
int fromY = thisView.getTop();

mRecyclerView.smoothScrollBy(0, fromY - toY);

似乎能快速解决问题。

只需简单地调用这个方法:

((LinearLayoutManager)recyclerView.getLayoutManager()).scrollToPositionWithOffset(yourItemPosition,0);

而不是:

recyclerView.scrollToPosition(yourItemPosition);

如果你想自动滚动而不显示滚动运动,那么你需要写以下代码:

mRecyclerView.getLayoutManager().scrollToPosition(position);

如果你想显示滚动运动,那么你需要添加以下代码。 步骤1:你需要声明SmoothScroller。

RecyclerView.SmoothScroller smoothScroller = new
                LinearSmoothScroller(this.getApplicationContext()) {
                    @Override
                    protected int getVerticalSnapPreference() {
                        return LinearSmoothScroller.SNAP_TO_START;
                    }
                };

=>步骤2:你需要添加这段代码任何事件,你想要执行滚动到特定的位置。 首先你需要设置目标位置为平滑滚动。

smoothScroller.setTargetPosition(position);

然后你需要将SmoothScroller设置为LayoutManager。

mRecyclerView.getLayoutManager().startSmoothScroll(smoothScroller);

请注意,如果scrolltopposition不工作,请注意您的RecyclerView是在一个NestedScrollView;参考这篇文章