使用LinearLayoutManager滚动到RecyclerView的顶部


74

我在其中有一个片段RecyclerViewLinearLayoutManager其中有CardView项目。单击时有一个浮动操作按钮,项目应滚动到顶部。我已经尝试使用scrollToPosition以及和以及scrollToPositionWithOffset一起RecyclerView使用LinearLayoutManager,如下所示。但这根本没有效果。为什么会这样呢?谁能帮我一下。

而且我已经将xmlRecyclerView直接放置SwipeRefreshView在xml文件中。我setFloatingActionButton尽快将适配器设置为RecyclerView

 public void setFloatingActionButton(final View view) {
    float = (android.support.design.widget.FloatingActionButton) getActivity().findViewById(R.id.float);
    float.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
    mRecyclerView.smoothScrollToPosition(0);


            android.support.design.widget.Snackbar.make(view, "Scrolled to Top", android.support.design.widget.Snackbar.LENGTH_SHORT)
                    .setAction("Ok", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            LinearLayoutManager llm = (LinearLayoutManager) mRecyclerView.getLayoutManager();
                            llm.scrollToPosition(0);

                        }
                    })
                    .setActionTextColor(getActivity().getResources().getColor(R.color.coloLink))
                    .show();
        }
    });
}

试试mLayoutManager.scrollToPositionWithOffset(0, 0);
Antrromet

是的,我已经尝试过了。但这没有效果,就像scrollToPosition一样。
SRBhagwat 2015年

太奇怪了,因为即使我的布局也与您相似。我在RecyclerView布局管理器中有一个SwipeRefreshview,并将其放置在中,这对我有用。
Antrromet

如果我将适配器设置为recyclerview后立即调用scrollToPosition,是否有任何问题?
SRBhagwat 2015年

1
现在我放置了mlayoutmanager.scrollToPositionWithOffset(0,0); 在方法setFloatingAction按钮之外,它可以正常工作!
SRBhagwat 2015年

Answers:


155

从以上评论继续,理想情况下,替换

mRecyclerView.smoothScrollToPosition(0);

onClick浮动操作按钮的

mLayoutManager.scrollToPositionWithOffset(0, 0);

应该管用。您也可以删除SnackBar代码,因为无论如何您都不需要它。因此,以上所有方法应该看起来像

public void setFloatingActionButton(final View view) {
    float actionButton = (android.support.design.widget.FloatingActionButton) getActivity()
            .findViewById(R.id.float);
    actionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView
                    .getLayoutManager();
            layoutManager.scrollToPositionWithOffset(0, 0);
        }
    });
}

如果您说上述方法不起作用,请测试是否onClick()甚至调用了。尝试在其中添加日志消息,然后查看其是否已打印。


是的,我实际上是通过删除其他片段对此方法的调用而得到的。我将fab创建直接放在onCreate()方法中,现在可以正常工作了。
SRBhagwat 2015年

和小吃店不工作。没关系,不需要小吃吧。
SRBhagwat 2015年

此解决方案仅在第一个片段中有效。如果我从两个分支都调用setFloatingActionActionButton,则scrollToTop仅在第二个片段中有效,而在第一个片段中无效。我正在从第一个片段中扩展第二个片段。
SRBhagwat 2015年

您为什么首先在片段中而不是在活动中调用它?
Antrromet

如何在mainactivity中访问mRecyclerView并从main活动中设置mRecyclerView.scrollToPosition(0)?我是Android和Java的新手。在开发此应用时,我在学习很多东西
:)

14

使用该方法smoothScrollToPosition()对我来说适用于最新的Android版本。

layoutManager.smoothScrollToPosition(mRecyclerView, null, 0);

4

使用以下命令调用“ scrollToPosition(0)”:

public void scrollToPosition(final int position) {
    if (mRecyclerView != null) {
        getHandler().post(new Runnable() {
            @Override
            public void run() {
                mRecyclerView.scrollToPosition(position);
                if (position == 0) {
                    LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
                    layoutManager.scrollToPositionWithOffset(0, 0);
                    mScrollView.fullScroll(View.FOCUS_UP);
                }
            }
        });
    }
}

什么是mScrollView ..?
山姆

私有NestedScrollView mScrollView;
Lee Hounshell

0

在我的情况下,要求以相反的顺序填充视图,这使布局显示滚动视图的底部视图

layoutManager.smoothScrollToPosition(mRecyclerView, null, 'last_index') 并没有真正的帮助。

当我使“回收者”视图显示孩子到最后一个位置时,我的问题已解决

recyclerView.scrollToPosition(length-1)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.