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

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

喜欢的东西:

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

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

RecyclerView不支持滚动到绝对位置

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


当前回答

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

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

而不是:

recyclerView.scrollToPosition(yourItemPosition);

其他回答

//滚动项目pos

linearLayoutManager.scrollToPositionWithOffset(pos, 0);

试试对我有效的方法,酷!

创建一个私有静态变量int displayedposition = 0;

现在你的RecyclerView在你的活动中的位置。

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

                LinearLayoutManager llm = (LinearLayoutManager) myRecyclerView.getLayoutManager();


                displayedposition = llm.findFirstVisibleItemPosition();


            }
        });

将此语句放置在视图中显示前站点的位置。

LinearLayoutManager llm = (LinearLayoutManager) mRecyclerView.getLayoutManager();
        llm.scrollToPositionWithOffset(displayedposition , youList.size());

好吧,就是这样,它对我来说很好

如果你正在使用LinearLayoutManager或交错的GridLayoutManager,它们都有一个scrollToPositionWithOffset方法,该方法既取位置,也取项目从RecyclerView开始的偏移量,这似乎可以完成你所需要的(将偏移量设置为0应该与顶部对齐)。

例如:

//Scroll item 2 to 20 pixels from the top
linearLayoutManager.scrollToPositionWithOffset(2, 20);

简介

没有一个答案解释如何在顶部显示最后一项。因此,答案只适用于上面或下面仍然有足够的项来填充剩余的RecyclerView的项。例如,如果有59个元素,第56个元素被选中,它应该在顶部,如下图所示:

那么,让我们看看如何在下一段中实现它。

解决方案

我们可以使用linearLayoutManager来处理这些情况。scrollToPositionWithOffset(pos, 0)和额外的逻辑在适配器的RecyclerView -通过添加一个自定义边距下面的最后一项(如果最后一项是不可见的,那么这意味着有足够的空间填充RecyclerView)。自定义边距可以是根视图高度和项目高度之间的差值。因此,您的adaptor for RecyclerView将如下所示:

...
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    ...

    int bottomHeight = 0;
    int itemHeight = holder.itemView.getMeasuredHeight();
    // if it's the last item then add a bottom margin that is enough to bring it to the top
    if (position == mDataSet.length - 1) {
        bottomHeight = Math.max(0, mRootView.getMeasuredHeight() - itemHeight);
    }
    RecyclerView.LayoutParams params = (RecyclerView.LayoutParams)holder.itemView.getLayoutParams();
    params.setMargins(0, 0, params.rightMargin, bottomHeight);
    holder.itemView.setLayoutParams(params);

    ...
} 
...

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

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

而不是:

recyclerView.scrollToPosition(yourItemPosition);