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
大法好~
网友评论