SugarAdapter 开源库介绍

作者: chendroid | 来源:发表于2019-09-29 11:54 被阅读0次

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

    相关文章

      网友评论

        本文标题:SugarAdapter 开源库介绍

        本文链接:https://www.haomeiwen.com/subject/bsrfpctx.html