Android无限循环RecyclerView的完美实现方案
作者:xiasem 发布时间:2022-09-10 01:44:51
背景
项目中要实现横向列表的无限循环滚动,自然而然想到了RecyclerView,但我们常用的RecyclerView是不支持无限循环滚动的,所以就需要一些办法让它能够无限循环。
方案选择
方案1 对Adapter进行修改
网上大部分博客的解决方案都是这种方案,对Adapter做修改。具体如下
首先,让 Adapter 的 getItemCount() 方法返回 Integer.MAX_VALUE,使得position数据达到很大很大;
其次,在 onBindViewHolder() 方法里对position参数取余运算,拿到position对应的真实数据索引,然后对itemView绑定数据
最后,在初始化RecyclerView的时候,让其滑动到指定位置,如 Integer.MAX_VALUE/2,这样就不会滑动到边界了,如果用户一根筋,真的滑动到了边界位置,再加一个判断,如果当前索引是0,就重新动态调整到初始位置
这个方案是挺简单,但并不完美。一是对我们的数据和索引做了计算操作,二是如果滑动到边界,再动态调整到中间,会有一个不明显的卡顿操作,使得滑动不是很顺畅。所以,直接看方案二。
方案2 自定义LayoutManager,修改RecyclerView的布局方式
这个算得上是一劳永逸的解决方案了,也是我今天要详细介绍的方案。我们都知道,RecyclerView的数据绑定是通过Adapter来处理的,而排版方式以及View的回收控制等,则是通过LayoutManager来实现的,因此我们直接修改itemView的排版方式就可以实现我们的目标,让RecyclerView无限循环。
自定义LayoutManager
1.创建自定义LayoutManager
首先,自定义 LooperLayoutManager 继承自 RecyclerView.LayoutManager,然后需要实现抽象方法 generateDefaultLayoutParams(),这个方法的作用是给 itemView 设置默认的LayoutParams,直接返回如下就行。
public class LooperLayoutManager extends RecyclerView.LayoutManager {
@Override
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
}
2.打开滚动开关
接着,对滚动方向做处理,重写canScrollHorizontally()方法,打开横向滚动开关。注意我们是实现横向无限循环滚动,所以实现此方法,如果要对垂直滚动做处理,则要实现canScrollVertically()方法。
@Override
public boolean canScrollHorizontally() {
return true;
}
3.对RecyclerView进行初始化布局
来源:https://juejin.im/post/5cfa198ff265da1b8c197c2f


猜你喜欢
- 在style中如下面那样定义:<style name="mystyle"> <item name=&
- feignclient https接口调用报证书错误问题最近在使用 feignclient 过程中,和第三方通过https 协议交互的时候,
- 本文实例为大家分享了Java实现马踏棋盘的具体代码,供大家参考,具体内容如下马在某个点最多可能有8种走法,用递归和回溯实现。注:代码中,查找
- package com.wanmei.meishu;import java.io.FileInputStream;import java.i
- 效果如下: 布局文件activity_main.xml如下:<RelativeLayout xmlns:android="h
- 前言在以SpringBoot开发Restful接口时, 对于接口的查询参数后台也是要进行校验的,同时还需要给出校验的返回信息放到上文我们统一
- 实践过程效果代码class BaseClass{ public class Win32
- 一、Error:All flavors must now belong to a named flavor dimension问题描述:Er
- 三态的基本概念1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据。用new创建的对象,它没有持久化,
- 你要学会:流的概念处理字节流的类处理字符流的类Java标准输入输出文件管理类Java语言的输入输出类库1.流的概念流是指计算机各部件之间的数
- 本文介绍Android实现首字母导航条,先看张效果图,具体怎么实现看代码吧具体的步骤1.整体布局的显示 2. 实现A-Z的分组 3. 自定义
- 最近项目中遇到了华为虚拟按键适配的问题,主页是个RecylerView(如下图),如果不做适配,在界面初始化完毕后,虚拟按键会遮挡页面或者空
- 一、什么是JSONJSON: JavaScript Object Notation JS对象简谱,是一种类似于XML的语言。相比于XML,它
- 最近在做一个需求:从其他系统的ftp目录下载存储图片url的文件,然后读取文件中的url地址,根据地址下载图片后按天压缩成一个包,平均一个地
- 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错。为了更便于使用,笔者整
- 需求:Android客户端连接服务器端MySQL数据库中的内容环境部署服务器:apache-tomcat-8.5.9语言版本:Java 1.
- 1.非静态成员变量当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环例子:public class ConstructorCl
- 传输层安全性协议(英语:Transport Layer Security,缩写作 TLS),及其前身安全套接层(Secure Sockets
- 前言在我们做后端服务Dao层开发,特别是大数据批量插入的时候,这时候普通的ORM框架(Mybatis、hibernate、JPA)就无法满足
- 这篇文章主要介绍了springboot全局异常处理代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要