常规写法的探讨
常规的写法,为了使用 RecyclerView,必须指定一个 adapter 和 一个 LayoutManager。其中自定义的 adapter 必须继承自 RecyclerView.Adapter,其中必须实现几个接口:
public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType)
在这个接口当中根据类别创建ViewHolder和 inflatelayout,要是有多个item需要写一堆if-elsepublic void onBindViewHolder(ItemViewHolder viewHolder, int position)或者
public void onBindViewHolder(TRealViewHolder holder, int position, List<Object> payloads)<br />
在这个接口当中根据位置position取出对应的数据,并用于刷新viewHolder里面的UI。public int getItemCount()
在这个接口当中根据位置保存的数据数量指定列表控件item的数量
因此可以看出
- 👆以上几个接口的套路都是固定的,可以做一层统一的封装
- 其次
onCreateViewHolder和onBindViewHolder还不足以清晰直观的表达itemView是创建还是复用 Model和ViewHolder之间的映射关系没有做硬性规定
针对改进
- 注解的方式加载布局
- 将数据和视图分离
- 更加清晰的holder复用
1、注解的方式加载布局
1 | (resId = R.layout.item_infoone) |
2、数据与视图分离
举个例子 上面的InfoViewViewHolderOne需要使用 ItemDataModel的数据
1 | public class InfoViewHolderItemOne implements EasyAdapterItem<ItemOneData> { |
绑定是通过一个map来进行数据数据绑定,这样复用更加清晰
1 | private final SparseArray<Class<? extends BaseEasyViewHolder>> viewHolders = new SparseArray<Class<? extends BaseEasyViewHolder>>() { |
整体设计

使用
结合示例代码
1、定义 ViewItemType 类型枚举值:
2、定义具体 InfoViewViewHolderOne class和对应数据 ItemOneData 类型
3、绑定holder和viewitemType
1 | private final SparseArray<Class<? extends BaseEasyViewHolder>> viewHolders = new SparseArray<Class<? extends BaseEasyViewHolder>>() { |
4、初始化 数据源 List
1 | private final List<EasyAdapterItem> mAdapterItems = new ArrayList<>(); |
5、将Adapter设置给 RecyclerView
技术点
- 泛型、抽象
- 注解
- 反射
最后
由于使用到了反射去创建viewHolder,因此继承BaseEasyViewHolder时候注意防止混淆
1 |
|