本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Epoxy是一个Android三方库, 用于在RecyclerView中构建复杂视图.
Epoxy简介
Epoxy用于协助构建复杂的RecyclerView适配器. 一个EpoxyModel就表示了一个视图的类别. EpoxyModel控制了屏幕上每一项的数据和视力绑定. 而Model则是从自定义View或者xml布局文件中生成的.
而EpoxyController则声明了将什么样的Model添加到RecyclerView上. 用后备数据创建Model, 并将Model依照想要的顺序添加到RecyclerView上.
Epoxy将Model绑定视图, 计算diff判断是否发生变化, 保存视图状态, 也做了其它的RecyclerView生命周期任务.
EpoxyModel
Epoxy使用EpoxyModel对象来决定展示哪个视图以及如何将数据绑定到视图. 这跟流行的ViewModel相似. Model也允许控制视图的其它方面, 比如列表的列数目, id和保存状态.
创建Model
Epoxy提供了几种方式来生成Model对象.
- 注解自定义视图
- 使用Android数据绑定
- 使用ViewHolder模型
生成的Model对象有_后缀以表示他们是生成的.
Model ID
理念稳定的RecyclerView的概念内建于Epoxy, 意味着每一个EpoxyModel理应拥有唯一ID来标识自己. 这允许diff和保存状态.
Model的ID通过EpoxyModel#id(long)方法进行赋值. 这个id值通常来自数据库条目, 例如用户的ID.
然而, 许多场景下EpoxyModel不被数据库对象支持, 因而不具有清楚的可赋值ID. 这些场景下也许可以使用字符串作为Model的ID.
model.id("header")
或者, 如果用来自不同数据库表的对象表示EpoxyModel, 就会有ID冲突的风险. 如果这是个困扰的话, 则可以使用字符串来对ID使用命名空间.
model.id("photo", photoId)
model.id("video", videoId)
还有其它的id覆盖, 接收了多个数字或者字符串在需要的情况下创建自定义ID. 这些可选项会生成64位的hash值来创建id. 这种方式的缺点是, 因为id是通过hash计算的, 有可能会产生id冲突, 可能由此产生错误. 然而, 因为64位hash产生冲突的可能性很小. 假设散列码的均匀分布, 适配器中的几百个Model, 大概会有千亿分之一的冲突概率. 为防止冲突EpoxyController支持在重复探测到的时候的回退行为.
EpoxyController支持自增ID
对于表示静态内容的Model(比如header或者loader), 可以在EpoxyController中使用AutoModel注解来自动地生成唯一ID.