如何获取Recyclerview
或Layoutmanager
中的滚动位置?
我可以通过添加OnScrollListener
来测量滚动位置,但当方向改变时,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;
}
});
7条答案
按热度按时间ssgvzors1#
为便于将来使用,如果您要在同一
activity
中的Fragments
之间切换,并且您要做的只是保存recyclerview
的滚动位置,然后将recyclerview
恢复到同一滚动位置,则可以执行以下操作:在您的
onStop()/onDestroyView()/onPause()
中,无论哪个回调更合适,请执行以下操作:在你的
onStart()/onCreateView()/onResume()
中,无论哪个回调更合适,都可以这样做:这样,您就可以成功地将
recyclerView's
状态保留在parcelable
中,并在需要时恢复它。yshpjwxd2#
你不能得到它,因为它并不存在。
LayoutManager
只知道屏幕上的视图,它不知道以前的视图,它们的大小等。使用scroll侦听器计算的数字并不可靠,因为如果数据发生变化,
RecyclerView
将重新进行布局计算,而不会尝试重新计算真实的偏移量(如果视图发生移动,您将收到onScroll(0, 0)
)。RecyclerView估计滚动条的此值,您可以使用
View
类中的相同方法。computeHorizontalScrollExtent
computeHorizontalScrollRange
computeHorizontalScrollOffset
这些方法也有它们的垂直对应物。
js4nwp543#
我来到这个问题只是想得到当前滚动到的项目位置索引。对于其他想做同样事情的人,你可以使用以下代码:
你也可以得到这些其他职位:
findLastVisibleItemPosition()
findFirstCompletelyVisibleItemPosition()
findLastCompletelyVisibleItemPosition()
感谢this answer的帮助,它还展示了如何保存和恢复滚动位置。
gdx19jrr4#
recyclerView.computeVerticalScrollOffset()
就可以了。t40tm48m5#
找到了一种变通方法,可以获取
RecyclerView
中的最后滚动位置,并获得Suragch解决方案的信任...声明一个全局可访问的LinearLayoutManager
,以便能够在内部方法中访问它...调用populateChatAdapter
方法时,如果这是第一次调用,则滚动位置将是最后发送的消息,如果用户已经滚动以查看先前的消息,则再次调用方法以更新新消息则它们将保留其最后滚动到的位置...启动它们...
在填充适配器方法上
cu6pst1q6#
必须将
scrollDy
读入那么你可以得到
recyclerView'
的滚动位置0yycz8jy7#
要获取ScroolPosition,请尝试以下操作:
1.您将需要这个:
1.然后获取mLayoutManager的位置(如下所示):
有了这个“pos”你就得到了位置,从0开始。