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
投稿
猜你喜欢
- 本文实例讲述了winform中的ListBox和ComboBox绑定数据用法。分享给大家供大家参考。具体实现方法如下:本例实现将集合数据绑定
- 前段时间spring boot 2.0发布了,与之对应的spring cloud Finchley版本也随之而来了,两者之间的关系和版本对应
- 本文实例为大家分享了PopupWindow实现自定义overflow的具体代码,供大家参考,具体内容如下当Action Bar的Action
- 1、python的每一个语句的后面可以添加分号也可以不添加分号;在一行有多条语句的时候,必须使用分号加以区分2、查看Python版本号,在D
- 1.在res上面右键->New->Android resource directory2.点击之后,出现下图Resource t
- 本文实例讲述了C#使用委托(delegate)实现在两个form之间传递数据的方法。分享给大家供大家参考。具体分析如下:关于Delegate
- 目录前言方案一: 数组方案二:HashMap由 key 获取 value由 value 获取 key解决方案三:枚举总结前言开发系统一些状态
- 去年春节的时候支付宝推行的集福娃活动着实火的不能再火了,更给力的是春晚又可以全民参与咻一咻集福娃活动,集齐五福就可平分亿元大红包,只可惜没有
- java Class.getSimpleName() 的用法Usage in android:private static final St
- SpringBoot找不到javax.servlet.Filter的问题新创建一个SpringBoot项目,编译时出现了找不到javax.s
- C#利用win32 Api 修改本地系统时间、获取硬盘序列号,可以用于软件注册机制的编写!using System;using System
- 一、了解Spring自动装配的方式采用传统的XML方式配置Bean组件的关键代码如下所示<bean id="userMapp
- 一、基本介绍(Nexus(maven * ))1,如果没有搭建 * 会有什么问题?如果没有 * ,我们所需的所有构件都需要通过 Mave
- 一、ReentrantLockpackage com.ietree.basicskill.mutilthread.lock;import j
- 环境:apache-tomcat-8.5.15jdk1.8.0_172IDEA建立一个maven-webapp项目:Create New P
- 写在前面很久以前就听nice0e3师傅说打Fastjson可以试试C3P0,当时还不会java(虽然现在也没会多少)也就没有深究。最近调试F
- 在软件开发过程中经常需要知道程序运行的大概时间,或者需要在规定时间内取数据,这是可以使用下面的方法获取时间段,还可以用在限时循环方法一:/*
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 前言之前实现过《Android可签到的日历控件》的功能,跟这篇一样都是实现签到打卡功能,这篇实现的是按月进行打卡做标识,本篇内容实现的按周进
- 先介绍去掉标题栏的方法: 第一种:也一般入门的时候经常使用的一种方法 requestWindowFeature(Window.FEATURE