RecyclerView.scrollToPosition()
非常奇怪。
例如,假设RecyclerView
名为"rv"
。
如果现在项目10位于当前RecyclerView
下方,请致电rv.scrollToPosition(10)
,RecyclerView
会将项目10滚动到底部。
如果现在项目10在当前RecyclerView
中,请致电rv.scrollToPosition(10)
,不会有任何滚动,也不会做任何事情。
如果现在第10项位于当前RecyclerView
的顶部,请致电rv.scrollToPosition(10)
,RecyclerView
会将第10项滚动到顶部。
但我需要的是,每当我调用它时,RecyclerView
会将假定的位置滚动到当前视图的顶部,就像情况3.如何做到这一点?
答案 0 :(得分:41)
如果我理解了这个问题,你想滚动到一个特定的位置,但该位置是适配器的位置而不是RecyclerView
的项目位置。
您只能通过LayoutManager
实现此目的。
做类似的事情:
rv.getLayoutManager().scrollToPosition(youPositionInTheAdapter).
答案 1 :(得分:11)
以下链接可能会解决您的问题:
https://stackoverflow.com/a/43505830/4849554
只需使用首选项SNAP_TO_START:
创建一个SmoothScrollerRecyclerView.SmoothScroller smoothScroller = new
LinearSmoothScroller(context) {
@Override protected int getVerticalSnapPreference() {
return LinearSmoothScroller.SNAP_TO_START;
}
};
现在,您可以设置要滚动到的位置:
smoothScroller.setTargetPosition(position);
将SmoothScroller传递给LayoutManager:
layoutManager.startSmoothScroll(smoothScroller);
答案 2 :(得分:2)
如果您想要滚动到特定位置并且该位置是适配器的位置,那么您可以使用StaggeredGridLayoutManager
scrollToPosition
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
staggeredGridLayoutManager.scrollToPosition(10);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
答案 3 :(得分:0)
尝试recycler_view.smoothScrollBy(0, 100);
,这里 0 代表x-coordinate
, 100 代表y-coordinate
我在垂直recyclerView中使用了此功能移至垂直列表中的下一个位置,并移至上一个位置,我只需将 100 替换为 -100
答案 4 :(得分:0)
这是Kotlin代码段,但是您可以正确地按位置滚动到该项目。重点是为布局管理器声明成员变量,并使用其方法进行滚动。
lateinit var layoutManager: LinearLayoutManager
fun setupView() {
...
layoutManager = LinearLayoutManager(applicationContext)
mainRecyclerView.layoutManager = layoutManager
...
}
fun moveToPosition(position: Int) {
layoutManager.scrollToPositionWithOffset(position, 0)
}