当前位置: 首页 > news >正文

Android 万能的RecyclerView适配器(BaseRecyclerViewAdapterHelper)

引用:

implementation "io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.2"

BaseQuickAdapter

基本使用:

  • 快速使用

    class TestAdapter : BaseQuickAdapter<Status, TestAdapter.VH>() {// 自定义ViewHolder类class VH(parent: ViewGroup,val binding: LayoutAnimationBinding = LayoutAnimationBinding.inflate(LayoutInflater.from(parent.context), parent, false),) : RecyclerView.ViewHolder(binding.root)override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH {// 返回一个 ViewHolderreturn VH(parent)}override fun onBindViewHolder(holder: VH, position: Int, item: Status?) {// 设置item数据}}
  • 如果Adapter特别简单,可以使用BuickViewHolder

    class TestAdapter : BaseQuickAdapter<Status, QuickViewHolder>() {override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): QuickViewHolder {// 返回一个 ViewHolderreturn QuickViewHolder(R.layout.layout_animation, parent)}override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: Status?) {// 设置item数据holder.getView(R.id.xxxx)}}

点击事件:

  • item 点击事件

    adapter.setOnItemClickListener { adapter, view, position ->Tips.show("onItemClick $position")
    }
    
  • item 长按事件

    adapter.setOnItemLongClickListener { adapter, view, position ->Tips.show("onItemLongClick $position")true
    }
    
  • item 子控件点击事件

    // 需要传递控件 id
    adapter.addOnItemChildClickListener(R.id.iv_num_add) { adapter, view, position ->Tips.show("onItemChildClick:  add $position")
    }
    
  • item 子控件长按事件

    // 需要传递控件 id
    adapter.addOnItemChildLongClickListener(R.id.btn_long) { adapter, view, position ->Tips.show("onItemChildLongClick $position")true
    }
    

点击事件(扩展)

  • 去除点击抖动(双击)的点击方法。 默认500毫秒间隔,可以传递参数修改。

      // item 去除点击抖动的扩展方法adapter.setOnDebouncedItemClick { adapter, view, position ->}// item Child 去除点击抖动的扩展方法adapter.addOnDebouncedChildClick { adapter, view, position ->}

数据操作

  • 设置数据集合

    adapter.submitList(list)
  • 修改某一位置的数据

    //修改index为1处的数据
    adapter[1] = data
  • 新增数据

    // 尾部新增数据
    adapter.add(data)// 在指定位置添加一条新数据
    adapter.add(1, data)// 添加数据集
    adapter.addAll(list)// 指定位置添加数据集
    adapter.addAll(1, list)
  • 删除数据

    // 删除数据
    adapter.remove(data)// 删除指定位置数据
    adapter.removeAt(1)
  • 交换数据位置(仅仅是这两个数据的位置交换)

    // 交换两个位置的数据
    adapter.swap(1, 3)
  • 移动数据位置(注意和 swap 的区别)

    // 交换两个位置的数据
    adapter.move(1, 3)
  • 获取Item数据的索引

    // 如果返回 -1,表示不存在
    adapter.itemIndexOfFirst(data)
  • 根据索引,获取Item数据

    // 如果返回 null,表示没有数据
    adapter.getItem(1)

动画

  • 内部内置了5种默认动画:

    /**
    * BaseQuickAdapter.AnimationType.AlphaIn
    * BaseQuickAdapter.AnimationType.ScaleIn
    * BaseQuickAdapter.AnimationType.SlideInBottom
    * BaseQuickAdapter.AnimationType.SlideInLeft
    * BaseQuickAdapter.AnimationType.SlideInRight
    */
    adapter.setItemAnimation(BaseQuickAdapter.AnimationType.AlphaIn)
  • 自定义动画 需继承 ItemAnimator 实现自定义动画

    class CustomAnimation1 : ItemAnimator {override fun animator(view: View): Animator {// 创建三个动画val alpha: Animator = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f)val scaleY: Animator = ObjectAnimator.ofFloat(view, "scaleY", 1.3f, 1f)val scaleX: Animator = ObjectAnimator.ofFloat(view, "scaleX", 1.3f, 1f)scaleY.interpolator = DecelerateInterpolator()scaleX.interpolator = DecelerateInterpolator()// 多个动画组合,可以使用 AnimatorSet 包装val animatorSet = AnimatorSet()animatorSet.duration = 350animatorSet.play(alpha).with(scaleX).with(scaleY)return animatorSet}
    }// 设置动画
    adapter.itemAnimation = CustomAnimation1()
  • 重写动画执行操作

    class TestAdapter : BaseQuickAdapter<Status, QuickViewHolder>() {...override fun startItemAnimator(anim: Animator, holder: RecyclerView.ViewHolder) {}
    }
  • 是否打开动画

    adapter.animationEnable = true

更多Adapter

更多Adapter
 

项目地址

相关文章:

  • BloombergGPT—金融领域大模型
  • oracle-存储结构
  • 扫雷(c语言)
  • JAVA-ArrayList的相关坑
  • SQL高级:存储过程和触发器
  • MR实战:统计总分与平均分
  • 分库分表之Mycat应用学习二
  • 【网络面试(2)】DNS原理-域名和IP地址的查询转换
  • C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# Windows窗体技术及基础控件(一)
  • 08-接口文档管理工具-项目集成knife4j__ev
  • 【模拟电路】基础理论与实际应用
  • 八股文打卡day17——计算机网络(17)
  • 机器学习:贝叶斯估计在新闻分类任务中的应用
  • 【算法与数据结构】860、LeetCode柠檬水找零
  • Go语言中的包管理工具之Go Path的使用
  • CSS实用技巧
  • egg(89)--egg之redis的发布和订阅
  • HTML5新特性总结
  • HTML中设置input等文本框为不可操作
  • IDEA 插件开发入门教程
  • Java 网络编程(2):UDP 的使用
  • Python利用正则抓取网页内容保存到本地
  • Spring Boot快速入门(一):Hello Spring Boot
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Vue小说阅读器(仿追书神器)
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从0实现一个tiny react(三)生命周期
  • 从重复到重用
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 开源地图数据可视化库——mapnik
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 白色的风信子
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​flutter 代码混淆
  • #Linux(make工具和makefile文件以及makefile语法)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (第二周)效能测试
  • (力扣)循环队列的实现与详解(C语言)
  • (论文阅读40-45)图像描述1
  • (没学懂,待填坑)【动态规划】数位动态规划
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .libPaths()设置包加载目录
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • @Autowired 与@Resource的区别
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [Android Studio] 开发Java 程序
  • [BZOJ4010]菜肴制作
  • [C++] cout、wcout无法正常输出中文字符问题的深入调查(1):各种编译器测试
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [Django ]Django 的数据库操作
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分