常规写法的探讨
常规的写法,为了使用 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 |
|