我正在参加「启航计划」

PS:永远向着我能够做的事情上努力。

先看下该项目作者的介绍,MultiType 便是一个多类型列表视图的中间分发结构,它能协助你快速而且明晰地开发一些杂乱的列表页面,数据驱动视图,支持布局类型和 viewBinder 1对1及 一对多的联系绑定、面向接口编程,MultiType 将视图创立、数据填充的作业托付给了 ItemViewBinder,ItemViewBinder 对应要填充的数据类型 T 和 ViewHolder,后续不同的数据类型都需完成对应的 ItemViewBinder,项目地址如下:

  • MultiType

将从以下几个方面学习 MultiType 的源码

  1. MultiTypeAdapter的运用
  2. MultiTypeAdapter的register进程
  3. MultiTypeAdapter的ViewHolder和数据填充

MultiTypeAdapter的运用

简略看下 MultiTypeAdapter 写法上与一般 Adapter 上的不同,如下:

// base
adapter.register(TextItemViewDelegate())
adapter.register(ImageItemViewDelegate())
adapter.register(RichItemViewDelegate())
// One to many
adapter.register(Data::class).to(
  DataType1ViewDelegate(),
  DataType2ViewDelegate()
).withKotlinClassLinker { _, data ->
  when (data.type) {
    Data.TYPE_2 -> DataType2ViewDelegate::class
    else -> DataType1ViewDelegate::class
  }
}
adapter.items = items
recyclerView.adapter = adapter
adapter.notifyDataSetChanged()

详细细节这里不再赘述,详细能够移步去前面地址查看。

MultiTypeAdapter的register进程

MultiTypeAdapter 的 register 进程主要是将 Type 类型增加到 MultiTypeAdapter 对应的调集中,以供后续运用,调用进程如下:

下面看下 MultiTypeAdapter一对多联系的register进程:

MultiTypeAdapter源码分析

如上第 10 步又换回到了1对1的注册流程上了。

MultiTypeAdapter的ViewHolder和数据填充

上一小结 MultiTypeAdapter 主要是将原本 RecyclerView.Adapter 中的一下办法托付到了 ItemViewBinder 详细的子类完成中,并将详细的 ItemViewBinder、Linker、数据类型 T 的 Class 信息以 Type 的方法增加到 MultiTypeAdapter 中的类型调集中,其 Item 类型、ViewHolder 创立、数据填充都需通过详细的 ItemViewBinder 的子类完成,下面将详细探究这一进程。

getItemViewType

getItemViewType 用来回来 Item 的视图类型,MultiTypeAdapter 中的 getItemViewType 回来的视图类型索引是 MutableTypes 中对应 Type 的索引,调用流程如下:

MultiTypeAdapter源码分析

从上面可知终究回来的视图类型的索引为 index+linker.index,从源码可知在1对1的情况下运用的是 DefaultLinker,其默许的 index 是 0,所以终究回来的视图类型的索引便是 MutableTypes 中对应 Type 的索引 index。

onCreateViewHolder

onCreateViewHolder 用来依据布局文件创立生成 ViewHolder,详细调用流程如下:

MultiTypeAdapter源码分析

onBindViewHolder

onBindViewHolder 也是同理都是从增加的类型的调集中获取对应的托付的 ItemViewDelete 进行处理。

简略总结一下,上面这种运用方法便是将原来的 Recycler.Adapter 中的一些办法托付到了 ItemnViewDelegate 中,每种 Item 类型都增加到 MutableTypes 中的类型调集 types 中,详细完成则从托付的详细完成类中完成。

总结

简略总结下,将显现的 Item 的类型以 ItemViewBinder 的方法抽取出去,降低了不同 Item 的类型之间的耦合。使得能够随时增加 Item 的类型而无需修正 Adapter,只需增加新的 ItemViewBinder 的完成类即可。

作者说到的“一对多”的联系主要是同一个 Item 的类型对应多个布局完成,主要是学习作者代码思路,面向接口编程。个人理解 MultiTypeAdapter 适当于是对 RecyclerView.Adapter 的扩展而不是对其的封装,自己运用能够进一步封装,本文到此结束。