首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

打造一个通用的 RecyclerView Adapter

作者:ChayWong

链接:https://www.jianshu.com/p/89933f59428e

前言

在平时的开发中,我们经常会需要开发一个列表页,这时我们第一时间就能想到 RecyclerView,添加一个 Adapter,复写其中的方法,再添加一个 ViewHolder,等等。

当我们的列表越来越多的时候,就会让人很抓狂,不仅每次都要写很多重复代码,而且 Adapter 类的数量也会越来越多。

有没有什么办法能够优雅的避免每次添加重复代码吗?今天给大家分享一个简单的 Adapter 封装,可以让我们少写 90% 的重复代码。

通常的做法

一般情况下,我们要实现一个列表的步骤是这样的

添加一个 Adapter

这里省略了部分代码。

可以看出,其实 Adapter 里面的都是重复代码,既然是重复代码,那么一定有办法抽象出来。

封装 Adapter

我们的目标是创造一个通用的 Adapter,那么就要在 Adapter 上做文章。

由于 Adapter 只有一个,而 ViewHolder 可能有多个,为了使 Adapter 和 ViewHolder 能够形成一对多的关系,而且 Adapter 可以随时根据 position 获取对应的 ViewHolder,我们需要一个桥梁

桥梁已经有了,需要我们在 Activity 中实现,我们让它作为构造 Adapter 的参数传入

然后考虑多种布局方式,其实不过是每一个 ViewHolder 对应一个唯一的整数,我们很容易就能想到将 ViewHolder 放在一个 List 中,每一个 ViewHolder 对应一个下标,下标即可作为 viewType。

接下来到了构造 ViewHolder 的时候了,构造 ViewHolder 需要一个 View,作为构造函数的参数传入,这样我们就不能把 layout 作为 ViewHolder 的属性了,因为必须在初始化 ViewHolder 之前得到它。

总不能让 layout 也从 Delegate 中获取吧,这样太蠢了,那么有什么方法能够把 ViewHolder 和 layout 绑定,并且在 ViewHolder 初始化之前得到 layout 呢?

我们可以用注解,是的,将 ViewHolder 的 class 和 layout 绑定起来,就能实现我们想要的效果。

新建一个注解类

ViewHolder 需要添加注解,将 layout 绑定起来。

有了 ViewHolder 类和 View,我们就可以构造 ViewHolder 了

采用了反射的方式构造出 ViewHolder。

接下来就比较简单了,就剩下给 ViewHolder 填充内容了

接下来看一下 ViewHolder 基类的代码

添加了一些属性,方便我们使用。

下面我们使用封装好的 Adapter,实现一开始的那个列表

有没有感觉代码量骤降?而且是一劳永逸。

当然大家也可以基于该 Adapter 继续扩展更多功能。

混淆配置

由于我们是通过反射来构造 ViewHolder,因此要避免构造方法被混淆工具移除,添加以下配置即可

源码

https://link.jianshu.com/?t=https%3A%2F%2Fgithub.com%2Fwangchenyan%2FPonyExpress%2Ftree%2Fmaster%2Fapp%2Fsrc%2Fmain%2Fjava%2Fme%2Fwcy%2Fexpress%2Fwidget%2Fradapter

总结

今天的内容比较简单,提供了一种对 RecyclerView Adapter 封装的思路,减少重复代码。

Java和Android架构

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180309B1GR8100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券