如何使用RecyclerView.scrollToPosition()将位置移动到当前视图的顶部?

时间:2015-10-25 10:47:48

标签: android scroll android-recyclerview

RecyclerView.scrollToPosition()非常奇怪。 例如,假设RecyclerView名为"rv"

  1. 如果现在项目10位于当前RecyclerView下方,请致电rv.scrollToPosition(10)RecyclerView会将项目10滚动到底部。

  2. 如果现在项目10在当前RecyclerView中,请致电rv.scrollToPosition(10),不会有任何滚动,也不会做任何事情。

  3. 如果现在第10项位于当前RecyclerView的顶部,请致电rv.scrollToPosition(10)RecyclerView会将第10项滚动到顶部。

  4. 为了帮助理解,请查看此图片enter image description here

    但我需要的是,每当我调用它时,RecyclerView会将假定的位置滚动到当前视图的顶部,就像情况3.如何做到这一点?

5 个答案:

答案 0 :(得分:41)

如果我理解了这个问题,你想滚动到一个特定的位置,但该位置是适配器的位置而不是RecyclerView的项目位置。

您只能通过LayoutManager实现此目的。

做类似的事情:

rv.getLayoutManager().scrollToPosition(youPositionInTheAdapter).

答案 1 :(得分:11)

以下链接可能会解决您的问题:

https://stackoverflow.com/a/43505830/4849554

只需使用首选项SNAP_TO_START:

创建一个SmoothScroller
RecyclerView.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)
}