RecycleView滚动定位不准确问题研究

九路
• 阅读 130
  • 开发当中经常会遇到的产品需求,recycleview自动滚动到某一个位置。具体场景可能是如下:
  • 页面初始化之后自动自动跳转到某一个位置
  • 页面滚动之后要回到某一个位置
  • 为了展示完全需要recycleview做微小的位置偏移等

针对如上问题,我们先来看看recycleview都有什么方法提供给我们。

public void scrollToPosition(int position) {
        if (mLayoutSuppressed) {
            return;
        }
        stopScroll();
        if (mLayout == null) {
            Log.e(TAG, "Cannot scroll to position a LayoutManager set. "
                    + "Call setLayoutManager with a non-null argument.");
            return;
        }
        mLayout.scrollToPosition(position);
        awakenScrollBars();
    }

scrollToPosition(int position)方法,滑动到指定positionitem的顶部。

public void smoothScrollToPosition(int position) {
        if (mLayoutSuppressed) {
            return;
        }
        if (mLayout == null) {
            Log.e(TAG, "Cannot smooth scroll without a LayoutManager set. "
                    + "Call setLayoutManager with a non-null argument.");
            return;
        }
        mLayout.smoothScrollToPosition(this, mState, position);
    }

smoothScrollToPosition(int position) 方法同上,但是会有平滑滑动的效果。

public void scrollBy(int x, int y) {
        if (mLayout == null) {
            Log.e(TAG, "Cannot scroll without a LayoutManager set. "
                    + "Call setLayoutManager with a non-null argument.");
            return;
        }
        if (mLayoutSuppressed) {
            return;
        }
        final boolean canScrollHorizontal = mLayout.canScrollHorizontally();
        final boolean canScrollVertical = mLayout.canScrollVertically();
        if (canScrollHorizontal || canScrollVertical) {
            scrollByInternal(canScrollHorizontal ? x : 0, canScrollVertical ? y : 0, null);
        }
    }

scrollBy(int x, int y)方法通过传入偏移量进行滑动。

public void startSmoothScroll(SmoothScroller smoothScroller) {
            if (mSmoothScroller != null && smoothScroller != mSmoothScroller
                    && mSmoothScroller.isRunning()) {
                mSmoothScroller.stop();
            }
            mSmoothScroller = smoothScroller;
            mSmoothScroller.start(mRecyclerView, this);
        }

startSmoothScroll(SmoothScroller smoothScroller)通过传入一个SmoothScroller来控制recycleview的移动。

针对题前所说的三种情况来说 这个需求会涉及到几种情况如下:

  • 目标item已经出现在屏幕当中的情况,这时候调用方法一,方法二是达不到recycleview进行位置的移动的。这时候可以选择调用方法三来达到我们要的效果。
            val smoothScroller: RecyclerView.SmoothScroller = object : LinearSmoothScroller(mContext) {
                override fun getVerticalSnapPreference(): Int {
                    return SNAP_TO_START
                }
            }

            smoothScroller.targetPosition = CIRCLE_POSITION + 1
            mVirtualLayoutManager.startSmoothScroll(smoothScroller)

当然方法四也可以达到我们所要的效果,这时候需要算出来的是我们目标item距离顶部所需的距离

rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
                           ......
                int toTop = rv.getChildAt(n).getTop();
                rvProduct.scrollBy(0, top);
                     ......
    }
});
  • 当目标item如果说并没有出现在屏幕中时,方法一和方法二就可以达到我们需要的效果。
点赞
收藏
评论区
推荐文章
前端 滚动到目标元素位置 VUE 版本
1、前言想起之前一次在写一个小程序商城时候,详情页的类似锚点的跳转花了我不少时间,因为刚写,对小程序滚动,滚动距离那套不熟悉加之本身对什么滚动高度,元素距离顶部距离不是很了解,花了挺长时间的,这几天有空,就研究了下。2、先看效果在这里插入图片描述(https://imghelloworld.osscnbeijing.aliyuncs.c
Python进阶者 Python进阶者
1年前
一篇文章帮助你理解跑马灯的滚动原理
走马灯效果其实就是利用标签进行图片和文字滚动,设置的样式不一样,滚动的效果就不一样,实现“走马观花”的效果。一、滚动方式1\.普通滚动Document这里是您要填的内容1.1 文字碰到左边就会停止这里是您要填的内容1.2 文字碰到右边就会停止这里是您要填的内容2.图片滚动2.1 预设滚动图片滚动到右边界,自动再
Caomeinico Caomeinico
1年前
小程序手动实现路由拦截
小程序中并没有像vuerouter一样的路由拦截功能,所以需要自己手动实现,下面就把具体的实现方法分享出来供大家参考。具体实现思路与vue相同,定义一个全局的token变量,进入某一个页面的时候判断是否存在这个token是否存在,存在则正常跳转,不存在则跳转到登录页面。创建一个工具文件夹,创建一个routers.js,封装路由拦截的具体代码如
Stella981 Stella981
1年前
Python format 用法详解
一、填充字符串1\.位置print("hello{0},thisis{1}.".format("world","python"))根据位置下标进行填充print("hello{},thisis{}.".format("world","python"))根据顺序自动填充
Wesley13 Wesley13
1年前
unity 使物体跟随路径点自动移动位置
可以做全自动的动画,只要设置好路径点就可以了,privateTransformways1;//路径点的位置publicTransformtagret;//移动的物体privateintindex1;privatevoidStart(){
Stella981 Stella981
1年前
Axure中怎么制作锚点
实现目标点击导航条不同的菜单,页面跳到菜单相应的位置,实现页面自动滚动。1. 拖入编辑区3个矩形,并相应命名为菜单1,菜单2,菜单3;!(https://oscimg.oschina.net/oscnet/06f0b4fbaf28e43de8bbf44d62d356f0f27.png)2. 再新建3个想要制作的文本框准备进行
Stella981 Stella981
1年前
DragonBonesPro小游戏
1.开场动画首先将素材导入到DragonBones中,然后将各个素材图片移动到合适的位置,然后调整图层上下位置,并在20帧左右插入关键帧然后在0帧放入各素材进入背景时的位置以及时间顺序,最后就是创建补件动画调整各素材的大小变化!(https://oscimg.oschina.net/oscnet/upf664d9444d9254f2
Wesley13 Wesley13
1年前
JS之滚动条效果2
在前面一篇说的是滚动条效果,本篇继续在前面的基础上面针对滚动条进行操作。本次要实现的效果如下:拖动滚动条左右移动时,上面的图片内容也相对外层盒子做相对移动。!(https://oscimg.oschina.net/oscnet/c64767294c846f5a670e95fe57384474d3d.png)下面针对要实现的效果进行分析:首先是页面
Wesley13 Wesley13
1年前
UI2CODE再进化!结合Redux的框架升级!
背景UI2CODE的目标是通过分析视觉稿得到对应的代码,让AI提高开发效率。然而过去静态化页面的产出,不能得到业务场景的需求。针对于此,我们以UI2CODE自动化开发为基底,结合Redux的消息机制,将自动化生成的维度提升到页面的处理。透过框架,可自动化生成页面代码,并且具有数据驱动展示、消息派送等动态性能力。期望在复杂的业务场景下,简化开发的
松
6个月前
务实|内容滚动与导航标签互动关联方案
务实|内容滚动与导航标签互动关联方案一、需求场景描述1.先看演示效果类似这种,当也页面左侧内容滚动的时候,需要关联激活左侧导航节点;当点击右侧导航节点时,也会将左侧对应的内容滚动到可视区域顶部的场景,并不少见,比如知识类社区,掘金查看文章时,百度查看百科词条时,都有这种场景,而我的实际开发种也遇到此类需求。遂有此文。2.需求分解:1.滚动左侧内容,关联激活右侧导航节点2.单击右侧导航节点,右侧相应的段落滚动到可视区顶部二、关键技术点提前知技术点1:Element.scrollIntoView()1