如何在Recyclerview/Layoutmanager中获得Scrollposition?

seb*_*seb 27 java android android-recyclerview

如何获得滚动RecyclerviewLayoutmanager

我可以通过添加一个来测量滚动位置OnScrollListener,但是当Orientation更改scrollDy为0时.

    mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            int scrollDy = 0;
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                scrollDy += dy;
            }
        });
Run Code Online (Sandbox Code Playgroud)

yig*_*git 41

你无法得到它,因为它确实不存在.LayoutManager只知道屏幕上的观点,它不知道之前的观点,它们的大小是什么等.

您可以使用滚动侦听器计算的数字是不可靠的,因为如果数据更改,RecyclerView将执行新的布局计算,并且不会尝试重新计算实际偏移量(onScroll(0, 0)如果移动了视图,您将收到).

RecyclerView估计滚动条的这个值,您可以使用View类中的相同方法.

computeHorizontalScrollExtent

computeHorizontalScrollRange

computeHorizontalScrollOffset

这些方法也有垂直对应方式.


Sho*_*war 25

对于今后的使用,如果你之间切换Fragments在同一个activity和所有你想要做的是保存滚动位置recyclerview,然后恢复recyclerview到相同的滚动位置,你可以做如下:

在您的onStop()/onDestroyView()/onPause()回调更合适的情况下,请执行以下操作:

Parcelable recylerViewState = recyclerView.getLayoutManager().onSaveInstanceState();
Run Code Online (Sandbox Code Playgroud)

在你的onStart()/onCreateView()/onResume()回调更合适的情况下,这样做:

recyclerView.getLayoutManager().onRestoreInstanceState(recylerViewState);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以成功地保持recyclerView's状态parcelable并随时恢复.

  • 谢谢!它非常优雅地解决了我的问题! (2认同)

Sur*_*gch 18

我想到的问题只是想获得当前滚动到的项目位置索引.对于想要这样做的其他人,您可以使用以下内容:

LinearLayoutManager myLayoutManager = myRecyclerView.getLayoutManager();
int scrollPosition = myLayoutManager.findFirstVisibleItemPosition();
Run Code Online (Sandbox Code Playgroud)

您还可以获得以下其他职位:

  • findLastVisibleItemPosition()
  • findFirstCompletelyVisibleItemPosition()
  • findLastCompletelyVisibleItemPosition()

感谢这个答案的帮助.它还显示了如何保存和恢复滚动位置.


And*_*Dev 12

recyclerView.computeVerticalScrollOffset() 诀窍。