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

标签:Android,RecyclerView,无限循环
0
投稿

猜你喜欢

  • C#实现微信红包功能

    2023-11-30 02:49:51
  • WinForm相对路径的陷阱

    2022-01-20 10:25:18
  • C#使用WebClient实现上传下载

    2022-04-22 21:46:31
  • java启动线程的3种方式对比分析

    2023-12-17 08:38:41
  • java如何删除以逗号隔开的字符串中某一个值

    2023-06-12 11:59:19
  • Spring JPA之find拓展方法示例详解

    2021-12-11 03:50:49
  • C# 调用 JavaWebservice服务遇到的问题汇总

    2023-04-23 04:00:49
  • Android中如何优雅的处理重复点击实例代码

    2023-09-28 12:14:35
  • 基于Spring@Autowired注解与自动装配详谈

    2022-01-14 09:38:49
  • Android实现卫星菜单效果

    2021-12-12 23:44:28
  • C# 骑士飞行棋的源码(分享)

    2021-10-11 02:54:56
  • Unity实现切割图集工具

    2021-07-03 23:14:57
  • 彻底搞定堆排序:二叉堆

    2022-12-06 23:24:15
  • Android中使用Matrix控制图形变换和制作倒影效果的方法

    2022-11-23 07:35:23
  • IDEA中的clean,清除项目缓存图文教程

    2022-02-05 09:02:02
  • java判断http地址是否连通(示例代码)

    2023-08-05 03:24:05
  • Android 6.0调用相机图册崩溃的完美解决方案

    2022-10-13 02:00:39
  • Java中的StringBuilder性能测试

    2021-09-11 03:38:20
  • Maven搭建springboot项目的方法步骤

    2022-08-08 09:50:09
  • VS Code开发React-Native及Flutter 开启无线局域网安卓真机调试问题

    2022-04-05 18:32:06
  • asp之家 软件编程 m.aspxhome.com