【问题标题】:How to use RecyclerView.scrollToPosition() to move the position to the top of current view?如何使用 RecyclerView.scrollToPosition() 将位置移动到当前视图的顶部?
【发布时间】:2015-10-25 10:47:48
【问题描述】:

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

  1. 如果现在第 10 项在当前RecyclerView 下,请调用rv.scrollToPosition(10)RecyclerView 会将第 10 项滚动到底部。

  2. 如果现在第 10 项在当前RecyclerView 中,则调用rv.scrollToPosition(10),不会有任何滚动,什么都不会做。

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

为了帮助理解,看这张图

但我需要的是,每当我调用它时,RecyclerView 都会像案例 3 一样将假定的位置滚动到当前视图的顶部。怎么做?

【问题讨论】:

标签: android scroll android-recyclerview


【解决方案1】:

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

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

执行以下操作:

rv.getLayoutManager().scrollToPosition(youPositionInTheAdapter).

【讨论】:

  • 如何将 AdapterPosition 传递给此方法?
  • 我确定这是不正确的。在 RecyclerView 上调用 scrollToPosition 只是在 LayoutManager 上调用相同的方法。它甚至在 javadocs 中说“RecyclerView 不实现滚动逻辑,而是将调用转发给 android.support.v7.widget.RecyclerView.LayoutManager#scrollToPosition 在 RecyclerView 或 LayoutManager 上调用 scrollToPosition 将产生完全相同的效果。
  • @Zeeshan 对 StaggeredGridLayoutManager 的回答非常有效! (见下文)
  • 使用linearLayoutManager.scrollToPositionWithOffset(position, 0);
  • @Castor 对此表示感谢。一个看似很小但很关键的区别 - scrollToPosition 似乎确保目标视图在回收器的某处可见(通常是底部),而 scrollToPositionWithOffset 0 确保目标视图在回收器的顶部可见。
【解决方案2】:

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

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);

【讨论】:

  • 如果你想做平滑滚动没问题,但是如果你想做自动滚动呢?
  • 如果您想自动向下滚动到某个位置,在这种情况下,此代码将完美运行。它会自动向下滚动到平滑过渡的某个位置......我希望你的问题是正确的。
  • 问题是我的 RecyclerView 有大约 700 个项目,所以如果到目标滚动的距离 30,我想自动跳转到该项目。在那种情况下,我不想使用平滑滚动。我怎样才能“快速启动”该项目?
  • @4gus71n 我也有同样的问题。我相信您想更改操作以使用 jumpTo() 曾经有一个瞬时滚动条,但在 api 22 中已弃用
  • @AlexanderN.很好,我不知道这种方法。我会尽快尝试的。
【解决方案3】:

如果你想滚动到一个特定的位置并且那个位置就是适配器的位置,那么你可以使用StaggeredGridLayoutManagerscrollToPosition

   StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
   staggeredGridLayoutManager.scrollToPosition(10);
   recyclerView.setLayoutManager(staggeredGridLayoutManager);

【讨论】:

    【解决方案4】:

    这是 Kotlin 代码 sn-p 但您可以正确地按位置滚动到项目。重点是为布局管理器声明成员变量,并使用其方法进行滚动。

    lateinit var layoutManager: LinearLayoutManager
    
    fun setupView() {
        ...
    
        layoutManager = LinearLayoutManager(applicationContext)
        mainRecyclerView.layoutManager = layoutManager
    
        ...
    }
    
    fun moveToPosition(position: Int) {
        layoutManager.scrollToPositionWithOffset(position, 0)
    }
    

    【讨论】:

      【解决方案5】:

      试试recycler_view.smoothScrollBy(0, 100);这里0代表x-coordinate100代表y-coordinate我在垂直recyclerView中使用了这个我想滚动到垂直的下一个位置列出并进入上一个位置,我只是将 100 替换为 -100

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 2023-02-01
        相关资源
        最近更新 更多