假设有RecyclerView不同的元素ViewHolder。
一种类型的列表项可以有七个小部件EditText,另一种类型可以有其他组件。每个元素类型都有自己的验证逻辑等。
当然,标准解决方案是将 viewholders 放入单独的类中。然而,适配器将有一堆条件if来决定如何用数据填充视图,为给定类型创建哪个视图,等等。
然后问题出现了,我需要在另一个屏幕上使用具有小验证逻辑的相同元素(假设该字段不应以数字开头并且包含少于 8 个字符)。是的,我可以重用 viewholder,但我仍然需要通过初始化来遍历样板getItemViewType(), onCreateViewHolder()...
组织一堆 Adapter-ViewHolder 的最佳方式是什么?
ViewHolder内部和/或匿名类转移到公共类查看http://hannesdorfmann.com/android/adapter-delegates中描述的解决方案。
那里引入了一个新实体 -
AdapterDelegate。如果应用程序中有很多列表,委托允许您卸载适配器和ViewHolder,并使它们尽可能可重用。在这种情况下,ViewHolder没有任何逻辑。EditText它只是对 View 元素(等)的引用的类持有者。在委托中,您可以注入Презентеры,通过它传递用户操作。但是,存在列表的一个元素在多个地方被重复使用的情况,并且在这个元素中,例如,执行“like”。注入
Презентер不是很方便,因为为了最终执行所需的用户脚本,会出现重复代码和拉取额外的依赖项。因此,可以向这个委托中注入一个特殊的委托,它只UseCase (Interactor)执行用户的场景——按下点赞按钮。在我的项目中,我使用这个库https://github.com/vivchar/RendererRecyclerViewAdapter
相当容易使用,支持 DiffUtil、Payloads、Nested RecyclerView...
如何使用:
1)为你的模型添加一个接口
2) 为 RecyclerView 项目创建布局
3)初始化适配器
4)为每个模型添加一个渲染器