Android RecycleView滑动停止后自动吸附效果的实现代码(滑动定位)
作者:叫我大红领巾 发布时间:2023-06-05 21:23:40
标签:Android,RecycleView,滑动定位,吸附
最近有个需求 要求列表 滑动后第一条 需要和顶部对齐
上网找了找 发现 官方支持 Recycle + LinearSnapHelper 可以实现
但我实际操作加上后 发现会卡顿 滑动卡顿 没有以前那种流畅感了
想了想 算了 懒得看源码 还是自己写一个得了
效果图 :
代码如下 注释很清楚了
package com.example.testapp
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.testapp.code.note.JoinData
import com.example.testapp.code.note.TheatreJoinerAdapter
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
//isUserControl 表示是否是 第二次定位滑动
@Volatile
private var isUserControl = false
var runnable = Runnable {
smoothScrollToPosition()//处理rcy定位
}
val list = arrayListOf<JoinData>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
for (i in 0..50) {
list.add(JoinData("小名${i}", i))
}
rcy.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
var adapter = TheatreJoinerAdapter(this, list)
rcy.adapter = adapter
rcy.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(r: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(r, dx, dy)
//判断是否是自动滚动
if (r.scrollState == RecyclerView.SCROLL_STATE_SETTLING && !isUserControl) {//自动滚动
//滚动幅度 在 -3 .. 3以内 其实时接近停止了 慢速滑动了 这时我们让他停止
if (dy in -3..3) {//向下滚动
r.stopScroll()
}
}
}
override fun onScrollStateChanged(r: RecyclerView, newState: Int) {
super.onScrollStateChanged(r, newState)
if (newState == RecyclerView.SCROLL_STATE_IDLE) {//滑动停止
if (!isUserControl) {
rcy.postDelayed(runnable, 200)//200 毫秒延时任务
}
}
if (r.scrollState != RecyclerView.SCROLL_STATE_SETTLING) {//非自动滑动
isUserControl = false
}
}
})
}
private fun smoothScrollToPosition() {
isUserControl = true
val stickyInfoView = rcy.getChildAt(0) //获取头部View 第一个view
val bottom = stickyInfoView.bottom//获取view底部到rcy的顶部高度
val height = stickyInfoView.measuredHeight//获取view高度
if (bottom != height) {//去除正好停在正好的位置的情况
if (bottom >= (height / 2)) {//判断view在上一半还是在下一半
rcy.smoothScrollBy(0, -(height - bottom))//二次滑动
} else {
rcy.smoothScrollBy(0, bottom)//二次滑动
}
}
}
}
结束
来源:https://blog.csdn.net/qq_42535851/article/details/109319524
0
投稿
猜你喜欢
- 目录一、ThreadLocal简介二、ThreadLocal简单使用三、ThreadLocal的实现原理1、set方法源码2、get方法源码
- 前言本文主要给大家介绍了关于Android中GridView布局整体居中的相关内容,是对于自己在项目中遇到问题的一个记录,分享出来供大家参考
- 我们在上网的过程中经常看到各种图片,那你知道它是如何实现的吗?接下来就让我们一块探讨一下。 网络图片的浏览可以分为俩部分,基本的页面布局与界
- kaptcha是一个开源的验证码实现库1.添加依赖<dependency> <groupId>com.g
- 匿名类类型类可以是匿名的 - 也就是说,可以在没有 identifier 的情况下声明类。在将类名称替换为 typedef 名称时,这会很有
- 1、static是什么意思?static 关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。例如Main类pa
- 本文实例为大家分享了Android实现密码明密文切换的具体代码,供大家参考,具体内容如下小眼睛在密码栏右边!奉上我使用的素材:添加图片到re
- 单例模式为什么要用单例确保某个类只有一个对象,常用于访问数据库操作,服务的配置文件等。单例的关键点1、默认构造函数为private,复制构造
- 如下所示:# ===============================================================
- 本文通过是 * 实现的AOP功能的封装与配置的小框架.加深对 * 和AOP编程的理解设计根据配置文件的键xxx对应的值(类全名)创建相应
- package com.letv.cloud.spider;import java.util.HashSet;import java.uti
- 最近由于工作要求:前端采用vue开发,后端采用springboot开发,前后端分离开发,最后前端页面又整合到后端来。经历多次采坑,总结以下方
- 近期对两个应用进行改造,在上线过程中出现一系列问题(其中一部分是由于ObjectId误区导致的)先来了解下ObjectId:TimeStam
- 看完我上一篇文章,「你都理解创建线程池的参数吗?」之后,当遇到这种问题,你觉得你完全能够唬住面试官了,50k轻松到手。殊不知,要是面试官此刻
- 废话不多说,直接上代码: 很简单:将类复制到项目中,最后在配置文件上配置一下:logUrl即可。 默认保存在:项目/temp/lo
- Unity中,我们怎么制作UI物体发光的渐隐渐现的效果呢?比如说我们有一张月亮光晕的精灵图片我们可以给它添加一个CanvasGroup组件我
- 抽象类(abstract):抽象类不能创建实例,它只能作为父类被继承。抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有
- 一、注册表操作简介Registry类,RegistryKey类提供了操作注册表的接口RegistryValueKind:用于指定操作注册表的
- 使用自定义注解实现接口限流在高并发系统中,保护系统的三种方式分别为:缓存,降级和限流。限流的目的是通过对并发访问请求进行限速或者一个时间窗口
- 原理拓展函数是kotlin里一个比较常用的特性,例如我们可以给Context拓展一个toast方法:// MainActivity.ktfu