用startSmoothScroll实现RecyclerView滚动到指定位置并置顶,含有动画。

RecyclerView一键滑到顶部,并控制滑动速度 1 需要新建一个LayoutManager,然后重写SmoothScrollToPosition,如下图新建FastScrollLinearLayoutManager,继承LinearLayoutManager public class FastScrollLinearLayoutManager extends LinearLayoutManager { private float MI... 阅读详情

RecyclerView滚动到指定位置并置顶

RecyclerView本身提供了几个定位的方法,除了手动滑动的scrollTo,smootScrollTo和scrollBy,smoothScrollBy方法之外,有一个直接滑动到指定位置item的scrollToPosition方法和另一个在此基础上平滑滚动的smoothScrollToPosition方法。但是经实验,该方法只能保证指定位置的item滑动到屏幕可见,如果指定的item本来就已在屏幕可见范围,则不会滑动,并且屏幕外的item滑到可见范围后,还需手动置顶。
常见处理方式
看了网上大多数相关的博客,一般的处理都是将item区分为 在可见范围以上/在可见范围内/在可见范围以下 三种情况,分别进行处理。
1、item在第一个可见item之前,直接用smoothScrollToPosition,则当该item移动到可见范围时,它就在RecyclerView顶部
2、item在可见范围内,即在第一个可见item之后,最后一个可见item之前,那么这时scrollToPosition失效,需要手动计算该item的view距离顶部的距离,用scrollBy自行移动到置顶位置
3、item在最后一个可见item之后,用smoothScrollToPosition滑动到可见范围 (此时该item在最后一个位置),再获取该item的view,计算到顶部距离,再监听RecyclerView的滑动,对其进行二次滑动到顶部
贴上该方法主要的实现代码:
//标记是否需要二次滑动
    private boolean shouldMove;
    //需要滑动到的item位置
    private int mPosition;

    /**
     * RecyclerView滑动到指定item函数
     */
    private void smoothMoveToPosition(RecyclerView recyclerView, final int position) {
        // 获取RecyclerView的第一个可见位置
        int firstItem = recyclerView.getChildLayoutPosition(recyclerView.getChildAt(0));
        // 获取RecyclerView的最后一个可见位置
        int lastItem = recyclerView.getChildLayoutPosition(recyclerView.getChildAt(mRecyclerView.getChildCount() - 1));
        if (position < firstItem) {
            // 指定item在第一个可见item之前
            recyclerView.smoothScrollToPosition(position);
        } else if (position <= lastItem) {
            // 指定item在可见范围内,即在第一个可见item之后,最后一个可见item之前
            int position = position - firstItem;
            if (position >= 0 && position < recyclerView.getChildCount()) {
                // 计算指定item的view到顶部的距离
                int top = recyclerView.getChildAt(position).getTop();
                // 手动滑动到顶部
                recyclerView.smoothScrollBy(0, top);
            }
        } else {
            // 指定item在最后一个可见item之后,用smoothScrollToPosition滑动到可见范围
            // 再监听RecyclerView的滑动,对其进行二次滑动到顶部
            recyclerView.smoothScrollToPosition(position);
            mPositon = position;
            shouldMove = true;
        }
    }

 …………

/**
 * 监听RecyclerView的滑动,对需要进行二次滑动的item进行滑动
 **/
 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if ( shouldMove && RecyclerView.SCROLL_STATE_IDLE == newState) {
                    shouldMove = false;
                    smoothMoveToPosition(mRecyclerView, mPosition);
                }
            }
        });
本文推荐的另外一种处理方式
通过上面的代码可以看出来,这种处理方式比较麻烦,而且处理逻辑需要分成两块,并不够直观。因此点开源码,发现实际上RecyclerView在用smoothScrollToPosition函数时,是创建了一个LinearSmoothScroller:

在这里插入图片描述

再继续点开看:

在这里插入图片描述

一进入文件就发现了SNAP_TO_START这个参数,注释意思是,将子view与父view左对齐或顶部对齐,其中是左对齐还是顶部对齐,是根据LayoutManager是horizontal还是vertical决定,因此重写LinearSmoothScroller,设置该参数即可实现置顶。
public class TopSmoothScroller extends LinearSmoothScroller {
    TopSmoothScroller(Context context) {
        super(context);
    }
    @Override
    protected int getHorizontalSnapPreference() {
        return SNAP_TO_START;
    }
    @Override
    protected int getVerticalSnapPreference() {
        return SNAP_TO_START;  // 将子view与父view顶部对齐
    }
}
之后获取RecyclerView的LayoutManager,调用startSmoothScroll即可
final TopSmoothScroller mTopScroller = new TopSmoothScroller(this);
mTopScroller.setTargetPosition(position);
mRecyclerView.getLayoutManager.startSmoothScroll(mTopScroller);
通过RecyclerView的scrollToPosition()和smoothScrollToPosition()方法实现滚动到列表指定的位置 大家好,我是专职Android研发,有14年研发经验,其中Android研发经验已经有10年。曾任职上市公司,有车机导航、机器人等行业及研发经验,热衷于技术和研发。除Android专业外,也研究并使用Python、PHP、JavaScript、前端、中间件、数据库等技术。目前开始通过博客对自己的知识和经验进行归纳和总结,由于工作较忙,不定期去更新博客。希望本博客的内容能够真正帮助到一些同学。 阅读详情

相关推荐

Android RecyclerView滚动定位

概述 RecyclerView在安卓开发中非常实用,而且简单易用,但是在实际开发中一直有一个问题困扰着我,就是定位问题,实际的项目中总是会遇到这样的需求:检索RecyclerView的某一项(各个项的高度不确定),然后定位这一项,将它显示在顶部。用RecyclerView的默认移动的方法并不能实现这一点(个人感觉官方可能出于性能考虑才不实现这一点)。这篇博客就讲解下我个人是如何实现这个需求的。 Demo演示 敲代码前的思考 RecyclerView提供的用于控制移动的方法有2个 – scrollToPosition(int) 这个方法的作用是显示指定项,就是把你想置顶的项显示出来,但是

Android-RecyclerView系列 滑动到指定位置

一、LayoutManager 1、LayoutManager.scrollToPositionWithOffset ((LinearLayoutManager)mRecyclerView.getLayoutManager()).scrollToPositionWithOffset(toPosition, 0); 1、mRecyclerView : RecyclerView 控件 2、toPosition : 指定移动位置 方式二:RecyclerView 1、RecyclerView.scroll

圈池 1万+

Wireshark 4.6 TCP 流图解析:3种拥塞控制算法可视化对比

本文深入解析Wireshark 4.6的TCP流图功能,通过可视化对比Reno、Cubic和BBR三种主流拥塞控制算法的性能特征。文章提供详细的实验环境搭建方法、流图分析工具使用技巧,以及算法调优建议,帮助网络工程师优化TCP性能。

weixin_29291573的博客 447

Android RecyclerView 滑动到指定item(position)并加动画

其实Android RecyclerView组件已经自带了移动方法: RecyclerView.scrollToPosition(position) //没有动画效果 但是这个方法没有动画效果,很生硬,直接就滑动过去了,下面来看一个有滑动动画效果的: val smoothScroller= object : androidx.recyclerview.widget.LinearSmoothScro...

新猿的博客 5458

Abaqus仿真突然中断?手把手教你解决SIGTERM/SIGINT报错(附完整命令行方案)

本文深入解析Abaqus仿真中因SIGTERM或SIGINT信号导致进程意外中断的根本原因,并提供了一套完整的命令行解决方案。通过将作业提交方式从图形界面切换到命令行,并配合关键参数设置,可以有效避免因会话空闲超时或外部干扰引发的计算中断,保障长时间仿真任务的稳定运行。

devops8pract的博客 748

ESP32之 ESP-IDF + Clion 开发环境搭建(二)—— Linux版

本文介绍了 Linux 下,使用Clion IDE 用官方 ESP-IDF 开发包进行 ESP32 开发的环境搭建

Augtons 的博客 6099

用SmoothScroller实现RecyclerView滚动到指定位置并置顶

问题描述:最近遇到了一个点击TabLayout定位到RecyclerView对应item并置顶的需求。经查阅资料和自己看源码,找到了更好的解决方法,特在此记录以给遇到相似场景的同学们以参考。 RecyclerView滚动到指定位置并置顶 RecyclerView本身提供了几个定位的方法,除了手动滑动的scrollTo,smootScrollTo和scrollBy,smoothScrollBy方...

步步小猫的博客 6408

PowerBuilder 9.0安装组件全解析:Adaptive Server Anywhere、PowerDynamo、InfoMaker到底怎么选?

本文从技术架构师视角详细解析PowerBuilder 9.0安装组件选型策略,包括Adaptive Server Anywhere、PowerDynamo和InfoMaker的核心功能与应用场景。通过分析组件间的依赖关系和安装冲突机制,提供针对不同开发需求的最佳安装方案,帮助开发者高效配置PB9.0开发环境。

weixin_28700593的博客 443

android滑动到指定位置置顶,纠正:Android RecyclerView滚动到指定位置并置顶(滚动方法、移动置顶、定位滑动到指定位置item)...

最近博主发现让RecyclerView滑动到某一位置并置顶的博客一大堆,抄的是完全一模一样。此外,虽然这些博客“解决”了这些问题,但这种解决方案过于浅显、粗暴,甚至都违背了开发思想。遂在此纠正这种错误。RecyclerView提供了几种移动的方法scrollToPositionscrollToscrollBysmoothScrollBysmoothScrollToPosition由于多数博客鱼龙混...

weixin_42602368的博客 1831

华为云Stack的学习(三)

LVS是四层负载均衡,建立在OSI模型的传输层之上,所以效率非常高。NAT模式的转发主要通过修改IP地址(位于OSI模型的第三层网络层)实现转发。DR模式的转发主要通过修改MAC地址(位于OSI模型的第二层数据链路层)实现转发。云服务框架中使用的DR模式。域名解析服务器分为管理侧(OM)和租户侧(Tenant)**DNS-OM:**作为云服务的本地DNS服务器,为云服务提供域名解析服务,并代理公网域名的解析。

Ciyaso的博客 8562

Silvaco Athena实战:从零搭建MOSFET工艺仿真流程(附mos1ex03完整代码解析)

本文详细介绍了使用Silvaco Athena从零搭建MOSFET工艺仿真的全流程,包括环境配置、核心工艺步骤、器件成型及参数提取等关键环节。通过mos1ex03案例的完整代码解析,帮助读者掌握网格划分、氧化层生长、离子注入等实战技巧,提升半导体工艺仿真能力。

weixin_42648844的博客 406

recyclerView平滑滚动(动画滚动)并置顶

一行代码解决: RecyclerViewScrollHelper.scrollToPosition(recyclerView,position); RecyclerViewScrollHelper源码: import android.content.Context; import android.support.v7.widget.LinearLayoutManager; impo...

jingzz1的博客 5228

Openclaw第3章:进阶部署

本章面向需要在特定环境中稳定运行 OpenClaw 的用户,介绍 Windows、Linux、Docker 以及 Cloudflare Workers 四种进阶部署方式。每种方式各有侧重:Windows 部署适合桌面用户日常使用,Linux 部署适合开发者,Docker 部署适合追求环境隔离的运维场景,Cloudflare Workers 部署则适合希望获得全球边缘网络加速的用户。读者可根据自身环境和需求选择合适的方案,完成本章后可继续阅读第4章了解维护升级流程。

Maynor的博客 1295

Android中RecyclerView指定的item滚动到顶部

1.新建一个类,继承LinearSmoothScroller() 2.重写他的两个回调方法 class TopSmoothScroller (context: Context) :LinearSmoothScroller(context) { override fun getHorizontalSnapPreference(): Int { return SNAP_TO_S...

zhuhewie的博客 2798

Keras神经网络可视化模块keras.utils.visualize_util的安装配置方法

本文介绍了如何安装和配置keras.utils.visualize_util模块,并提供了一个简单的示例演示如何使用该模块来可视化神经网络的结构。在上述代码中,我们首先定义了一个简单的神经网络模型,该模型具有一个输入层、一个隐藏层和一个输出层,其中隐藏层具有512个神经元,输出层具有10个神经元。运行上述代码后,我们将在当前工作目录下找到一个名为model.png的文件,它显示了神经网络的结构图。这种方式有效地展示了整个过程,让我们能够更好地理解神经网络的结构,方便对其进行改进和调试。

. 893

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

处理复杂列表场景:IndicatorFastScroll的指示器过滤与自定义滚动实现

在Android开发中,高效管理长列表一直是开发者面临的挑战。IndicatorFastScroll作为一款轻量级Android库,为RecyclerView提供了简洁的滚动指示器控制,帮助用户快速定位列表内容。本文将详细介绍如何利用IndicatorFastScroll处理复杂列表场景,包括指示器过滤功能和自定义滚动实现,让你的应用列表交互体验更上一层楼。 ## 核心功能解析:为什么选择Ind

gitblog_01183的博客 927

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android开发:RecyclerView平滑流畅的滑动到指定位置

背景 在项目中,想使RecyclerView慢慢的平缓滑动指定位置,于是使用: RecyclerView.smoothScrollToPosition(int);复制代码发现效果并不理想,滑动过程很突兀,很快就滑动到了指定位置,并没有像函数名那样smooth(流畅的,平滑的),也就是说smoothScrollToPosition没有滑动效果,黑人问号??? 本文原创作者MichaelX,掘金链接:...

weixin_33724570的博客 458

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IndicatorFastScroll完全解析:从基础用法到高级自定义的完整教程

IndicatorFastScroll是一款强大的Android库,专为RecyclerView提供简单高效的快速滚动UI控件。它能帮助开发者轻松实现类似通讯录的字母索引、分类快速导航等功能,提升用户在长列表中的浏览体验。本教程将从基础集成到高级定制,带你全面掌握这个实用工具的使用方法。 ## 为什么选择IndicatorFastScroll? 在处理长列表数据时,传统的滚动方式往往效率低下。

gitblog_01138的博客 778

实现猫眼电影影片浏览效果

前言部分 因为项目要对接猫眼电影,需要做一个和猫眼电影一样的影片选择效果,其实这本篇文章的内容是网上凑出来的。虽说是东拼西凑,但是过程中还是有些收获,毕竟有些东西还是要亲自实践才能深入理解。 不多说先上个效果图吧: 内容部分 实现效果大体分为几部分: 一个横向滚动的列表(RecyclerView) 列表要选中的条目需要居中显示(LinearSnapHelper) 选中的条目需要放大效果(或者把...

鲨鱼不会飞的博客 1250

Android layoutmanager 使用过的统计

1.饿了么/频道管理左侧 点击条目 居中 竖直 public class CenterLayoutManager extends LinearLayoutManager { public CenterLayoutManager(Context context) { super(context); } public CenterLayoutManager(Context context, int orientation, boolean reverseLayou.

FlyPig_Vip的博客 371

Android RecycleView实现平滑滚动置顶和调整滚动速度

在实际项目里,RecycleView可以说是我们最常用到的组件,作为绑定并展示LIST数据的组件,经常需要实现平滑滚动到列表里的某个目标ITEM,并且将其置顶在屏幕最上方,而且在特殊情形下,我们需要控制滑动速度,来控制滚动的时长。

指尖流连敲击梦想,代码行行承载远方! 5454

纠正:Android RecyclerView滚动到指定位置并置顶(滚动方法、移动置顶、定位滑动到指定位置item)

最近博主发现让RecyclerView滑动到某一位置并置顶的博客一大堆,抄的是完全一模一样。此外,虽然这些博客“解决”了这些问题,但这种解决方案过于浅显、粗暴,甚至都违背了开发思想。遂在此纠正这种错误。 RecyclerView提供了几种移动的方法 scrollToPosition scrollTo scrollBy smoothScrollBy smoothScrollToPosit...

晨光飞舞的专栏 7113

RecyclerView - 实现目标Item滚动到指定位置(SmoothScroller)

scrollToPositionWithOffset:offset - 项目视图的起始边缘与RecyclerView的起始边缘之间的距离(以像素为单位)。这里相比scrollToPosition,我们就可以设置偏移量: 如果offset = 0,我们可以理解为将目标Item刻意的滚动到顶部第一个可见位置,如果offset = 100,将目标Item刻意的滚动到距离顶部第一个可见位置往下偏移100px,然后以此类推... 如果只是想使某个位置可见,请使用scrollToPosition(int)

最孤单的人的博客 1万+

recyclerview,滚到指定位置

RecyclerView指定item滚动顶部 对于recyclerview滚动大家知道有scrollTo,scrollBy这种类似的方法。 但是大家有没有发现,当让recycleview滚动到某一位置会出现如下两种情况, 1:对于recyclerView滚动到某个position位置,当这个position位置不在当前界面内,recyclerView会滚动到当前position位置。 2:如果这个

wxilin2111的博客 785

Kotlin--›Android RecyclerView滚动处理(滚动到底部/顶部/居中/偏移/动画等特性)

之前写过一篇Android–>RecyclerView 显示底部,滚动底部(无动画)文章. 当时是为了满足需求, 没想太多顺手写的. 虽然功能上能满足, 但是代码上还是有点low. 这几天, 我的徒弟傻豆 在写一个IM项目, 需要滚动到底部. 于是我重写了一个ScrollHelper滚动操作类. 文章目录特性需求分析1.滚动, 滚动偏移, 滚动动画2. 滚动到顶部, 底部, 居中3.锁定滚动...

<angcyo>菜鸟视角 2602
上一篇: android解决工具类中没有context中的问题
下一篇: pagerslidingtabstrip 横向滑动
JSON_ZJS
博客等级 码龄9年 30粉丝 159原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值