首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RecyclerView -如何平滑滚动到某一位置上的项目顶部?

RecyclerView -如何平滑滚动到某一位置上的项目顶部?
EN

Stack Overflow用户
提问于 2015-07-05 21:30:17
回答 14查看 150.9K关注 0票数 167

在RecyclerView上,我可以通过以下方法突然滚动到所选项目的顶部:

代码语言:javascript
运行
复制
((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(position, 0);

但是,这会突然将项目移到最高位置。我想移动到一个项目的顶部平滑的

我也试过:

代码语言:javascript
运行
复制
recyclerView.smoothScrollToPosition(position);

但是,它不能很好地工作,因为它没有将项目移动到选定的位置到顶部。它只是滚动列表,直到位置上的项目可见为止。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2017-04-19 20:52:01

RecyclerView设计为可扩展,因此不需要仅仅为了执行滚动就将LayoutManager (作为droidev suggested)子类化。

相反,只需创建一个带有首选项SNAP_TO_STARTSNAP_TO_START

代码语言:javascript
运行
复制
RecyclerView.SmoothScroller smoothScroller = new LinearSmoothScroller(context) {
  @Override protected int getVerticalSnapPreference() {
    return LinearSmoothScroller.SNAP_TO_START;
  }
};

现在,将要滚动到的位置设置为:

代码语言:javascript
运行
复制
smoothScroller.setTargetPosition(position);

并将该SmoothScroller传递给LayoutManager:

代码语言:javascript
运行
复制
layoutManager.startSmoothScroll(smoothScroller);
票数 314
EN

Stack Overflow用户

发布于 2015-09-28 08:53:50

为此,您必须创建一个自定义LayoutManager

代码语言:javascript
运行
复制
public class LinearLayoutManagerWithSmoothScroller extends LinearLayoutManager {

    public LinearLayoutManagerWithSmoothScroller(Context context) {
        super(context, VERTICAL, false);
    }

    public LinearLayoutManagerWithSmoothScroller(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
                                       int position) {
        RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext());
        smoothScroller.setTargetPosition(position);
        startSmoothScroll(smoothScroller);
    }

    private class TopSnappedSmoothScroller extends LinearSmoothScroller {
        public TopSnappedSmoothScroller(Context context) {
            super(context);

        }

        @Override
        public PointF computeScrollVectorForPosition(int targetPosition) {
            return LinearLayoutManagerWithSmoothScroller.this
                    .computeScrollVectorForPosition(targetPosition);
        }

        @Override
        protected int getVerticalSnapPreference() {
            return SNAP_TO_START;
        }
    }
}

将其用于您的RecyclerView并调用smoothScrollToPosition。

例子:

代码语言:javascript
运行
复制
 recyclerView.setLayoutManager(new LinearLayoutManagerWithSmoothScroller(context));
 recyclerView.smoothScrollToPosition(position);

这将滚动到指定位置的RecyclerView项的顶部。

希望这能有所帮助。

票数 121
EN

Stack Overflow用户

发布于 2018-12-31 11:23:40

这是我在Kotlin中编写的一个扩展函数,用于RecyclerView (基于@Paul答案):

代码语言:javascript
运行
复制
fun RecyclerView.smoothSnapToPosition(position: Int, snapMode: Int = LinearSmoothScroller.SNAP_TO_START) {
  val smoothScroller = object : LinearSmoothScroller(this.context) {
    override fun getVerticalSnapPreference(): Int = snapMode
    override fun getHorizontalSnapPreference(): Int = snapMode
  }
  smoothScroller.targetPosition = position
  layoutManager?.startSmoothScroll(smoothScroller)
}

像这样使用它:

代码语言:javascript
运行
复制
myRecyclerView.smoothSnapToPosition(itemPosition)
票数 64
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31235183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档