ErQi

MultiType解析

MultiType分析

MultiType

项目地址: https://github.com/drakeet/MultiType
作者博客: 作者的中文介绍

Android 复杂的多类型列表视图新写法,清晰、灵活、模块开发、插件化思想

核心

通过对Adapter的再拆分,通过MVP的模式实现解耦合打到插件化开发的便利性.

Model

对应ItemContent
这只是一个空接口,便于统一实现,带来了良好的扩展性.
每一个ItemContent都有其对应的ItemViewProvider,两者之间通过MultiTypePool这个工具类来完成对应的关系绑定.

View

对应ItemViewProvider将原来的Adapter中的onCreateViewHolder,onBindViewHolder在自己内部对应实现,这样在多类型时,就不用再一个adapter中的onCreateViewHolder,onBindViewHolder做过多的判断,去生成对应的ViewHolder和绑定数据,将功能实现解耦,模块更细分,从而提高代码的可读性.

Presenter

对应MultiTypeAdapter(大概吧.)
对应P的划分找不到一个合适的切入点,因为P是逻辑层负责调用ModelView,并处理相互之间的数据填充等,从这里来看那么就是MultiTypeAdapter没跑了,但是
MultiTypePool:负责处理ModelView之间的映射关系
TypeItem:负责包装Model,在MultiTypeAdapter中调用的是TypeTtem对象,在通过该对象调用到ItemContent.
TypeItemFactory:TypeItem的工厂类,根据ItemConten生成对应的TypeItem

未理解

Savable两个接口方法,一个传参byte[]一个返回byte[],但是感觉接口有点过于鸡肋,作用并不明显,可以在Model中指定参数即可.

作者回复

通过 Savable,我们可以把任意 TypeItem (可能包含不同的 ItemContent 子类对象),统一存储到一个数据库表中,不需要新增字段也不需要修改表结构。
简单说,Savable 使得我们能够不修改数据库字段和表结构的情况下,容纳任意类型数据,这和 MultiType 的设计初衷是一样的,做一个新需求,不需要修改任何旧的代码,只要增加新代码即可。
它是一个可选接口,如果你不需要存储,或者想自己设计存储方案,完全可以无视它、不必实现它。

个人理解

Savable是针对本地储存是的可选接口,提供了本地储存数据的统一格式,便于数据库储存,而不用针对不同类型数据时修改数据库类型.

个人优缺点分析

优点

MVP解耦合,便于插件化开发,方便界面多种类型布局的列表适配,极大的提升了代码的可读性,在还需要交流理解的情况下,代码可读性是至关重要的.

缺点

由于解耦合是针对于内部的Adapter中进行的,那么就不能和以前一样拿到数据,在内部进行判断在返回对应的itemType了,需要在获取数据源时针对数据源进行改造处理,变成对应的TypeItem集合了.