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

九路
• 阅读 709
  • 开发当中经常会遇到的产品需求,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
cookie 时效无限延长方案
自动化测试有2种形式,接口自动化和UI自动化。而UI自动化经常会被登录节点堵塞,例如验证码、图形、滑块等,尽管有些方式可以识别图形和定位滑块位置,但成功率都不高,无法真正意义上实现自动化执行;而http接口的自动化测试前置如果依赖cookie,也无法实现自动化执行。
Stella981 Stella981
3年前
Python format 用法详解
一、填充字符串1\.位置print("hello{0},thisis{1}.".format("world","python"))根据位置下标进行填充print("hello{},thisis{}.".format("world","python"))根据顺序自动填充
Wesley13 Wesley13
3年前
unity 使物体跟随路径点自动移动位置
可以做全自动的动画,只要设置好路径点就可以了,privateTransformways1;//路径点的位置publicTransformtagret;//移动的物体privateintindex1;privatevoidStart(){
Stella981 Stella981
3年前
Axure中怎么制作锚点
实现目标点击导航条不同的菜单,页面跳到菜单相应的位置,实现页面自动滚动。1. 拖入编辑区3个矩形,并相应命名为菜单1,菜单2,菜单3;!(https://oscimg.oschina.net/oscnet/06f0b4fbaf28e43de8bbf44d62d356f0f27.png)2. 再新建3个想要制作的文本框准备进行
Stella981 Stella981
3年前
DragonBonesPro小游戏
1.开场动画首先将素材导入到DragonBones中,然后将各个素材图片移动到合适的位置,然后调整图层上下位置,并在20帧左右插入关键帧然后在0帧放入各素材进入背景时的位置以及时间顺序,最后就是创建补件动画调整各素材的大小变化!(https://oscimg.oschina.net/oscnet/upf664d9444d9254f2
Wesley13 Wesley13
3年前
JS之滚动条效果2
在前面一篇说的是滚动条效果,本篇继续在前面的基础上面针对滚动条进行操作。本次要实现的效果如下:拖动滚动条左右移动时,上面的图片内容也相对外层盒子做相对移动。!(https://oscimg.oschina.net/oscnet/c64767294c846f5a670e95fe57384474d3d.png)下面针对要实现的效果进行分析:首先是页面
Wesley13 Wesley13
3年前
UI2CODE再进化!结合Redux的框架升级!
背景UI2CODE的目标是通过分析视觉稿得到对应的代码,让AI提高开发效率。然而过去静态化页面的产出,不能得到业务场景的需求。针对于此,我们以UI2CODE自动化开发为基底,结合Redux的消息机制,将自动化生成的维度提升到页面的处理。透过框架,可自动化生成页面代码,并且具有数据驱动展示、消息派送等动态性能力。期望在复杂的业务场景下,简化开发的
Wesley13 Wesley13
3年前
IP地址定位技术之一:基础数据采集
IP地理位置定位技术,包含基础数据采集、硬件系统搭建、应用场景划分和定位系统研发四项关键技术。基础数据采集为IP地理位置定位技术的研究提供基础数据支撑,是IP地址定位的基础性工作和关键技术。首先,按照不同的数据采集规则,针对不同数据源的数据格式,研究并实现一套自动化的智能化的数据采集技术;其次,对采集到的数据进行筛选、清洗和挖掘,形成基础数据库,为系统提
松
2年前
务实|内容滚动与导航标签互动关联方案
务实|内容滚动与导航标签互动关联方案一、需求场景描述1.先看演示效果类似这种,当也页面左侧内容滚动的时候,需要关联激活左侧导航节点;当点击右侧导航节点时,也会将左侧对应的内容滚动到可视区域顶部的场景,并不少见,比如知识类社区,掘金查看文章时,百度查看百科词条时,都有这种场景,而我的实际开发种也遇到此类需求。遂有此文。2.需求分解:1.滚动左侧内容,关联激活右侧导航节点2.单击右侧导航节点,右侧相应的段落滚动到可视区顶部二、关键技术点提前知技术点1:Element.scrollIntoView()1