技术二三Android开发经验谈Android技术知识

SugarAdapter 开源库介绍

2019-09-29  本文已影响0人  chendroid

SugarAdapter 介绍

这次介绍一个开源库:SugarAdapter

GitHub 地址: https://github.com/zhihu/SugarAdapter/

是知乎官方开源的一个 RecyclerView.Adapter 扩展库。

以下内容分为三部分:

  1. 简单介绍和原生的 `RecyclerView.Adapter使用
  2. SugarAdapter 的使用
    • 创建 RecyclerView 列表需要的数据集合 ListBuilder
    • 创建 ViewHolder
    • 添加这些 ViewHolderBuilder
    • 声明 SugarAdapter 变量
  3. 小结

正文开始:

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 最大的好处就是可以完全把 ViewHolderAdapter 隔绝开,且每个 ViewHolder 不会相互影响。

而当你使用 SugarAdapter 时,万物皆可作为 ViewHolder 任何 UI 都可作为卡片插入到 SugarAdapter 中去。

2 SugarAdapter 的使用

当你要使用 SugarAdapter, 需要做的工作如下:

  1. 创建 RecyclerView 列表需要的数据集合 ListBuilder
  2. 创建 ViewHolder
  3. 添加这些 ViewHolderBuilder
  4. 声明 SugarAdapter 变量
  5. 设置: 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 列表需要的数据集合 ListBuilder

实际在代码生产中,每一个 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
        ...
    }
}

@LayoutSugarAdapter 里面的一个注解,用来把当前的 ViewHolderLayout 一一对应。

ChildrenTagData 是一个数据类,里面的内容是该 ViewHolder 需要的信息,是它的数据类

其实在这个里面也可以看到 R.layout.tag_inner_layout - TagInnerHolder - ChildrenTagData 是一一对应的。

这也是 SugarAdapter 的一个优势,实现了各个数据的分离以及和对应 ViewHolder 样式的一一对应,代码也更加的清晰。

2.3 添加这些 ViewHolderBuilder

BuilderSugarAdapter 中一个很重要的类,它负责创建 Adapter 同时也起到数据源 listAdapterViewHolder 的沟通作用。

代码示例如下:

adapterBuilder.add(TagInnerHolder::class.java)
              .add(TagInnerMoreHolder::class.java) 

adapterBuilder.add 可一直 add 下去,通过这样的方式把 ViewHolder 添加进来。

如果足够细心,就会发现,builder 里面既有数据源 list 也有所有的 ViewHolder
剩下的就是把两者一一对应起来,怎么一一对应起来呢?便是通过每个 ViewHodler 创建时指定的数据源类型进行匹配的。
详细代码可参考源码。

2.4 声明 SugarAdapter 变量

既然以及做完了数据源的添加和 VIewHolder 的添加,那么便需要考虑到 RecyclerView.Adapter.

在 ``SugarAdapterAdapter` 的创建十分的简单便捷:

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 大法好~

上一篇 下一篇

猜你喜欢

热点阅读