RecyclerView是一个重要的控件,许多app都有使用。它是一个可以用在多种案例中的通用控件,但是以为其灵活性,也让adapter的创建多了许多工作。
支持多类型视图是其优于listview的一个方面。但是显示多类型视图需要许多公式化的重复代码。如果多余三个类型视图就有点让人手忙脚乱了。你可以多用几个if-else ,switch cases..但不幸的是,要重用床架和viewholder的代码不是一件易事。
MultiViewAdapter正是为了解决这个问题。虽然现在已经出现了几个解决方案,但是这些库都有一些限制:对象需要继承一个父类,这可能跟你的数据模型有点冲突。
强制在model类中持有layout resource ID,这打乱了依赖关系。
无法自己管理view type ID,通常是将 resource ID 作为view type,所以你无法在两个不同的view type中使用同一布局文件。
它们都没有利用DiffUtil。
如果你想让不同的view type具有不同的item-decorations/span-size/selection-modes,你必须写switch case语句。
MultiViewAdapter解决了所有这些问题。这个库有意采用了不影响对象模型和关系的设计。
源码
对于这个library所能达到的效果,让我们先睹为快:
功能特色对model的使用无限制。
对DiffUtil开箱即用的支持
支持单选和多选
每个view type可以有自己的span count 或者 ItemDecoration,你不必写switch cases 或者 if-else 语句。
如何使用
在app的gradle 文件中添加dependencydependencies {
// ... other dependencies here
compile 'com.github.devahamed:multi-view-adapter:1.1.0'
}
背后的概念
cyclerAdapter — adapter 类。它可以有多个ItemBinder和DataManager。继承自官方的RecyclerView.Adapter。
ItemBinder —ItemBinder的职责是创建和绑定viewholder。它有一个type参数,接收需要显示的model类。ItemBinder需要在RecyclerAdapter中注册。
DataManger — 它持有数据并且在数据修改的时候调用必要的动画。有两种DataManager。显示list的DataListManager以及显示一个item(比如Header, Footer 等)的DataItemManager。
创建简单的 adapter
假如你有一个对象列表,比如说“car”。如果你想显示一个“car”列表,下面是所有代码。public class CarAdapter ex