通过重写RecyclerView.LayoutManager实现

直接使用该LayoutManger即可

package com.example.testrecy.testimport android.util.Log
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.Recyclerclass MyLayoutManager : RecyclerView.LayoutManager() {private var looperEnable = trueoverride fun generateDefaultLayoutParams(): RecyclerView.LayoutParams {return RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)}override fun canScrollHorizontally(): Boolean {return false}override fun canScrollVertically(): Boolean {return true}override fun onLayoutChildren(recycler: Recycler,state: RecyclerView.State) {if (itemCount <= 0) {return}//preLayout主要支持动画,直接跳过if (state.isPreLayout) {return}//将视图分离放入scrap缓存中,以准备重新对view进行排版detachAndScrapAttachedViews(recycler)var actualHeight = 0for (i in 0 until itemCount) {//初始化,将在屏幕内的view填充val itemView = recycler.getViewForPosition(i)addView(itemView)//测量itemView的宽高measureChildWithMargins(itemView, 0, 0)val width = getDecoratedMeasuredWidth(itemView)val height = getDecoratedMeasuredHeight(itemView)//根据itemView的宽高进行布局layoutDecorated(itemView, 0, actualHeight, width, actualHeight + height)actualHeight += height//如果当前布局过的itemView的宽度总和大于RecyclerView的宽,则不再进行布局if (actualHeight > getHeight()) {break}}}override fun scrollVerticallyBy(dy: Int,recycler: Recycler,state: RecyclerView.State): Int {//1.上下滑动的时候,填充子viewval travel = fill(dy, recycler)if (travel == 0) {return 0}//2.滚动offsetChildrenVertical(travel * -1)//3.回收已经离开界面的recyclerHideView(dy, recycler)return travel}/*** 左右滑动的时候,填充*/private fun fill(dy: Int, recycler: Recycler): Int {var translateY = dyif (translateY > 0) {//标注1.向上滚动val lastView = getChildAt(childCount - 1) ?: return 0val lastPos = getPosition(lastView)//标注2.可见的最后一个itemView完全滑进来了,需要补充新的if (lastView.bottom < height) {var scrap: View? = null//标注3.判断可见的最后一个itemView的索引,// 如果是最后一个,则将下一个itemView设置为第一个,否则设置为当前索引的下一个if (lastPos == itemCount - 1) {if (looperEnable) {scrap = recycler.getViewForPosition(0)} else {translateY = 0}} else {scrap = recycler.getViewForPosition(lastPos + 1)}if (scrap == null) {return translateY}//标注4.将新的itemView add进来并对其测量和布局addView(scrap)measureChildWithMargins(scrap, 0, 0)val width = getDecoratedMeasuredWidth(scrap)val height = getDecoratedMeasuredHeight(scrap)layoutDecorated(scrap, 0, lastView.bottom,width, lastView.bottom + height)return translateY}} else {//向下滚动val firstView = getChildAt(0) ?: return 0val firstPos = getPosition(firstView)if (firstView.top >= 0) {var scrap: View? = nullif (firstPos == 0) {if (looperEnable) {scrap = recycler.getViewForPosition(itemCount - 1)} else {translateY = 0}} else {scrap = recycler.getViewForPosition(firstPos - 1)}if (scrap == null) {return 0}addView(scrap, 0)measureChildWithMargins(scrap, 0, 0)val width = getDecoratedMeasuredWidth(scrap)val height = getDecoratedMeasuredHeight(scrap)layoutDecorated(scrap, 0, firstView.top - height,width, firstView.top)}}return translateY}/*** 回收界面不可见的view*/private fun recyclerHideView(dy: Int,recycler: Recycler) {for (i in 0 until childCount) {val view = getChildAt(i) ?: continueif (dy > 0) {//向上滚动,移除一个上边不在内容里的viewif (view.bottom < 0) {removeAndRecycleView(view, recycler)Log.d(TAG,"循环: 移除 一个view  childCount=$childCount")}} else {//向下滚动,移除一个下边不在内容里的viewif (view.top > height) {removeAndRecycleView(view, recycler)Log.d(TAG,"循环: 移除 一个view  childCount=$childCount")}}}}fun setLooperEnable(looperEnable: Boolean) {this.looperEnable = looperEnable}companion object {private const val TAG = "MyLayoutManager"}
}

RecyclerView实现竖向无限循环滚动的列表相关推荐

  1. Swiper:无限循环滚动时出现空白页/页面内容不刷新

    问题描述 使用Swiper插件实现列表的无限循环滚动效果,记录遭遇的两个问题:①滚动到某页时界面显示空白:②用id唯一标识列表中需要动态改变的值,在改变某一id的div内容后,页面显示内容并未改变 问 ...

  2. 【Android】ViewPager实现无限循环滚动

    最近做的一个项目,客户要求在ViewPager实现的主页面中滑动到最后一页后继续滑动能返回到第一页,也就是实现无限循环滚动,效果如下: 看了下ViewPager没有滑到尽头的回调方法,因此想到的解决方 ...

  3. JQuery图片无限循环滚动源码

    平常项目中经常用到图片循环滚动,所以就写些必要的CSS定位,JS基本算法,最后就封装成JQuery图片无限循环滚动插件类,其实本质上是li块无限循环滚动,li块里面不管是图片还是其它内容,都OK的. ...

  4. [jQuery基础] jQuery动效案例(二) -- 图标特效、无限循环滚动(简易轮播图)

    图标特效 实现效果展示 实现步骤 第一步(实现静态效果) CSS部分 *{margin: 0;padding: 0; } ul{list-style: none;width: 400px;height ...

  5. ios之实现自动无限循环滚动视图(1)

    ios之实现自动无限循环滚动视图(1) 前言 效果展示 功能 分析 全部代码 前言 ios实现无限循环滚动主要有两种办法,都利用了UIScrollView,第一种是创建一个很大的UIScrollVie ...

  6. 文字/图片向上无限循环滚动

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. unity实现图片轮播效果_unity 背景无限循环滚动效果

    背景无限循环滚动效果如下示: 步骤如下: 导入背景图片后,设置图片的格式,如下图: 2.图片格式也可以设置是Texture格式,但是Wrap Mode 一定要是Repeat[重复发生]:然后记得App ...

  8. 在线直播系统源码,横向无限循环滚动的单行弹幕效果

    在线直播系统源码,横向无限循环滚动的单行弹幕效果实现的相关代码 实现思路分析 要实现上面的效果,我们先拆分下实现要素: 1.弹幕布局是从屏幕的右侧向左侧滚动,单个弹幕之间的间距是固定的(设计要求) 2 ...

  9. Unity的ScrollView无限循环滚动

    前言 此篇文章当作知识学习即可,需要使用循环复用的小伙伴可以尝试博主近期开发的ScrollCircleMaker v1.0,此插件功能比较完整,使用方便,如果遇到问题可以联系我进行修改. 当Scrol ...

最新文章

  1. JPA 一对一设置无效,连表查询的时候另外一个实体类的对象值为空
  2. opencv:在二维定标中的应用
  3. KVM虚拟机获取所有IP(shell)
  4. 二维(字符)数组输入(转载)
  5. RF(接口自动化测试)
  6. 我的世界服务器修改地图,《我的世界手机版》地图编辑器介绍 怎么修改地图信息...
  7. Three.js-设置环境纹理及加载hdr环境贴图
  8. 如何寻找已知轮廓的最大内接圆
  9. 【支付】中国银联作为收单机构的支付流程分析
  10. c++语言常量,C++常量(constant)
  11. 计算机心理学测试题目及答案解析,测量心理学考研重点选择题(含答案)
  12. 景深决定照相机什么特性_照相机光圈与景深的关系
  13. Mac M1芯片处理器能用的Bridge 2020/2019 for mac 解决M1版MAC安装BR无法安装问题 完美支持M1芯片处理器
  14. 开个水果店选址在哪,水果店选址的小窍门
  15. java实现简单窗口小游戏“扫雷”
  16. ABB机器人画圆编程_ABB机器人使用rapid编程中问号的用法及画整圆指令
  17. 如何申请腾讯云免费ssl证书并部署
  18. 浅谈Attention注意力机制及其实现
  19. Web开发浅涉(以JAVA为例)
  20. ffmpeg中AVPacket与AVFrame中数据的传递与释放

热门文章

  1. PS某色背景改为透明
  2. python读excel中数据画图_python读取excel数据并且画图的实现示例
  3. 微信小程序—一键复制文本
  4. 我们该如何高效的学习
  5. 基础教程:Mac 电脑小白应该了解哪些东西?
  6. Java生成包含大写字母,小写字母以及数字的无重复随机密码
  7. 奇虎360前端面试题
  8. openstack-创建多网络虚机
  9. SMTP, POP3, IMAP,Exchange ActiveSync区别
  10. Excel 数据透视表小技巧之 06 使用 Excel 数据透视表作为另一个数据透视表的数据源