Epoxy - 在RecyclerView中构建复杂界面 - 1

873 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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.