SugarAdapter 开源库介绍
SugarAdapter 介绍
这次介绍一个开源库:SugarAdapter
GitHub 地址: https://github.com/zhihu/SugarAdapter/
是知乎官方开源的一个 RecyclerView.Adapter 扩展库。
以下内容分为三部分:
- 简单介绍和原生的 `RecyclerView.Adapter使用
-
SugarAdapter的使用- 创建
RecyclerView列表需要的数据集合List和Builder - 创建
ViewHolder - 添加这些
ViewHolder到Builder - 声明
SugarAdapter变量
- 创建
- 小结
正文开始:
1 简单介绍 SugarAdapter 和原生的 RecyclerView.Adapter 使用
SugarAdapter 它是用来做什么的呢?
随着 RecyclerView 的大量使用,我们同时需要写 RecyclerView 对应的 Adapter,
而 SugarAdapter 正是对 Adapter 的封装,使得 RecyclerView 的使用更为方便。
当有很多中卡片的样式,我们需要编写很多的 ViewHolder,每一种样式卡片都做为一种 ViewHolder.
这种写法也是目前作为常用的写法。
而在原生的 RecyclerView.Adapter, 我们需要根据不同的 ViewType 去创建不同的 ViewHolder, 当卡片比较多时,无疑是一个比较繁琐的工作,且需要再次修改 Adapter 里的实现。
原生的写法类似于:
class TestRecyclerViewAdapter: RecyclerView.Adapter<TestRecyclerViewAdapter.BaseViewHolder>() {
override fun onCreateViewHolder(p0: ViewGroup, p1: Int): BaseViewHolder {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getItemCount(): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onBindViewHolder(p0: BaseViewHolder, p1: Int) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getItemViewType(position: Int): Int {
return super.getItemViewType(position)
}
inner class BaseViewHolder(view: View) : RecyclerView.ViewHolder(view) {
init {
// do nothing
}
}
}
如果想要区分不同的 ViewHolder 则需要跟随 position 或者对应的数据 data 去做区分,比较麻烦,没有完全的分割开 ViewHolder。
而 SugarAdapter 最大的好处就是可以完全把 ViewHolder 和 Adapter 隔绝开,且每个 ViewHolder 不会相互影响。
而当你使用 SugarAdapter 时,万物皆可作为 ViewHolder 任何 UI 都可作为卡片插入到 SugarAdapter 中去。
2 SugarAdapter 的使用
当你要使用 SugarAdapter, 需要做的工作如下:
- 创建
RecyclerView列表需要的数据集合List和Builder - 创建
ViewHolder类 - 添加这些
ViewHolder到Builder - 声明
SugarAdapter变量 - 设置:
mRecyclerView.setAdapter(mAdapter)
注:前提是,你按照官方文档引入了
SugarAdapter
引入代码:
dependencies {
// migrate to AndroidX, use 1.8.16
implementation 'com.zhihu.android:sugaradapter:1.7.16'
annotationProcessor 'com.zhihu.android:sugaradapter-processor:1.7.16'
}
目前 SugarAdapter 已经支持了 AndroidX 的迁移,很良心。
2.1 创建 RecyclerView 列表需要的数据集合 List 和 Builder
实际在代码生产中,每一个 item 都是来源自数据源 list 中的某一项。
为了实现「任何 UI 部分都可作为 RecyclerView 的一个 item」, 我们需要添加一个可容纳任何数据类型的 list:
// 可承载任何类型的数据
private val tagsList: MutableList<Any> = mutableListOf()
在 SugarAdapter 中,把数据源放入在 SugarAdapter.Builder 里面,它是 SugarAdapter 的一个静态内部类,具体可参考源码中的实现。
把数据源放入到 Builder 里面
val adapterBuilder = SugarAdapter.Builder.with(tagsList)
2.2 创建 ViewHolder
这部分也是最为重要的一部分,一个卡片样式即为一个 ViewHolder。
在官方使用文档中,这么定义:
sugarHolder
代码示例如下:
@Layout(R.layout.tag_inner_layout)
class TagInnerHolder(view: View) : SugarHolder<ChildrenTagData>(view) {
private val articleTagView by lazy {
itemView.article_tag_view
}
override fun onBindData(data: ChildrenTagData) {
articleTagView.text = data.name
...
}
}
@Layout 是 SugarAdapter 里面的一个注解,用来把当前的 ViewHolder 和 Layout 一一对应。
ChildrenTagData 是一个数据类,里面的内容是该 ViewHolder 需要的信息,是它的数据类
其实在这个里面也可以看到 R.layout.tag_inner_layout - TagInnerHolder - ChildrenTagData 是一一对应的。
这也是 SugarAdapter 的一个优势,实现了各个数据的分离以及和对应 ViewHolder 样式的一一对应,代码也更加的清晰。
2.3 添加这些 ViewHolder 到 Builder
Builder 是 SugarAdapter 中一个很重要的类,它负责创建 Adapter 同时也起到数据源 list 和 Adapter、 ViewHolder 的沟通作用。
代码示例如下:
adapterBuilder.add(TagInnerHolder::class.java)
.add(TagInnerMoreHolder::class.java)
adapterBuilder.add 可一直 add 下去,通过这样的方式把 ViewHolder 添加进来。
如果足够细心,就会发现,
builder里面既有数据源list也有所有的ViewHolder,
剩下的就是把两者一一对应起来,怎么一一对应起来呢?便是通过每个ViewHodler创建时指定的数据源类型进行匹配的。
详细代码可参考源码。
2.4 声明 SugarAdapter 变量
既然以及做完了数据源的添加和 VIewHolder 的添加,那么便需要考虑到 RecyclerView.Adapter.
在 ``SugarAdapter中Adapter` 的创建十分的简单便捷:
val adapter = adapterBuilder.build()
最后再通过 RecyclerView 的接口,把该 Adapter 设置给 RecyclerView, 即完成了工作。
recyclerView.adapter = adapter
至此就完成了所有的操作,是不是感觉很简单?
3. 小结
附一张图:
sugarAdapter 简单实现图.jpg
SugarAdapter 是我比较喜欢的一个大神写的,偶然的机会看到他开源了,便使用了一下,感觉很好用,而且 SugarAdapter 还有很多其他的功能,对于负责的列表和需求都是完全可以满足的。
不夸张的说,里面的代码极好,感兴趣的朋友可以看一看,是一个值得学习的开源库。
最后再次附上地址:https://github.com/zhihu/SugarAdapter
2019.09.27 by chendroid
PS: github 大法好~