Android RecycleView滑动停止后自动吸附效果的实现代码(滑动定位)

 更新时间:2020年10月30日 09:43:46   作者:叫我大红领巾  
这篇文章主要介绍了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)//二次滑动
   }
  }
 }
}

结束   

到此这篇关于Android RecycleView滑动停止后自动吸附效果的实现代码(滑动定位)的文章就介绍到这了,更多相关Android RecycleView滑动定位内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android中使用GridView进行应用程序UI布局的教程

    Android中使用GridView进行应用程序UI布局的教程

    GridView即平常我们见到的类似九宫格的矩阵型布局,只不过默认不带分割线,这里我们就从基础开始来看一下Android中使用GridView进行应用程序UI布局的教程
    2016-06-06
  • Android开发笔记之:ListView刷新顺序的问题详解

    Android开发笔记之:ListView刷新顺序的问题详解

    本篇文章是对Android中ListView刷新顺序的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 解析Android框架之Volley源码

    解析Android框架之Volley源码

    我们知道Volley是在2013年Google I/O大会上推出了一个新的网络通信框架,他的设计目的就是为了那些请求数据量不是特别大,但是又是特别频繁的网络操作非常适合。但是对于数据量较大的请求,比如说下载一个较大的文件,Volley可能相比于其他的框架,就有点不足了。
    2021-06-06
  • Kotlin基本数据类型详解

    Kotlin基本数据类型详解

    大家好,本篇文章主要讲的是Kotlin基本数据类型详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Android Studio三方引用报错但是项目可以运行的解决方案

    Android Studio三方引用报错但是项目可以运行的解决方案

    今天小编就为大家分享一篇关于Android Studio三方引用报错但是项目可以运行的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Android7.0 工具类:DiffUtil详解

    Android7.0 工具类:DiffUtil详解

    这篇文章主要介绍了Android7.0 工具类:DiffUtil的相关资料,并附实例代码,和实现效果图,需要的朋友可以参考下
    2016-09-09
  • android通用xml解析方法

    android通用xml解析方法

    之前做的网络相关的应用,里面涉及到了xml的解析,由于急于完成任务也没有设计就直接敲代码。这几天给一个朋友做项目的时候也涉及到了xml的解析,而且解析的内容比较多,我查看了以前的项目中的相关代码,顿时觉得很多代码都是可以优化的。在此写两个通用的xml解析方法,当然这里所讲的通用只是在一定程度上并且需要遵守一些规范。
    2013-03-03
  • Android Studio实现简单计算器功能

    Android Studio实现简单计算器功能

    这篇文章主要为大家详细介绍了Android Studio实现简单计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Android 多种简单的弹出框样式设置代码

    Android 多种简单的弹出框样式设置代码

    这篇文章主要介绍了Android 多种简单的弹出框样式设置代码的相关资料,这是一个基于AlertDialog和Dialog这两个类封装的多种弹出框样式,其中提供各种简单样式的弹出框使用说明。对android弹出框样式感兴趣的朋友一起看看吧
    2016-11-11
  • android 引导界面的实现方法

    android 引导界面的实现方法

    现在越来越多程序都有引导页面了。网上资料不全。现在自己实现下。
    2013-06-06

最新评论