前言
- RecyclerView在实际业务中,会有很多场景以及需求会使用到。常见的例如:Header&Footer,Refresh,LoadMore,Pinned Header等等。这些场景你是否都会根据具体的需求,单独维护一套RecyclerView和Adapter,例如XXRefreshRecyclerView,XXXPinedHeaderRecyclerView….对于如此运用,笔者想说维护成本太高了,一个项目若存在多个RecyclerView那肯定是有问题的。
- 对于多个ViewTypeItem 的Adapter在加上Header和Footer,在加上ViewHolder的各个业务逻辑,你的Apdater是不是过于臃肿了,导致维护以及迭代的成本很高?
- 因此,笔者这边博客的用意就很清晰了。基于上述2点,使用一个万能的RecyclerView来实现上述常用的功能,以及封装一套RecyclerView.Adapter来简化ViewHolder以及多个ViewTypeItem 的构建。
- 但今天笔者先发布这个MultiTypeAdapter,后面会补充万能的RecyclerView封装。
项目
https://github.com/cxMax/MultiTypeAdapter
废话不说先上项目,有兴趣的可以看下readme.md,用法和各个类的用途也写得比较清楚了。
用法
跟Popup一样,这个的使用也只需要关心五个步骤:
- 创建JavaBean类 :
- ViewHolder的数据源
- 创建ViewHolder类 :
- 在constructor里面初始化view;
- 在update()方法里面,实现view更新;
- 可以继承BaseVH
- 创建Provider类 :
- 需继承AbsItemProvider, AbsItemProvider具有于RecyclerView.Adapter相同的生命周期函数。
- 主要目的是实现ViewHolder与javabean的绑定。
- 一般来说, 只需要override,onCreateViewHolder()和onBindViewHolder()即可,其他生命周期函数不用关心。
- 当然你还需要override,isForViewType(),这个是来判定provider持有的data是同一个viewtype的。
- 创建Adapter类 :
- 需继承MultiTypeAdapter, 一般来说,只需要override,registerAllProvider()和updateData()。
- ItemViewType可以在ViewTypeConstant中定义。
- 当然,对应具体的业务或者参数需要传递到viewholder,可以重写onCreateViewHolder()或onBindViewHolder(),具体参考GameCouponPinnedAdapter。
- 最后在Activity或者Fragment中调用RecyclerView.setAdapter即可.
代码
类关系 说明
- MultiTypeAdapter :
- 一个Adapter会持有一个MultiTypePool,对拥有的children进行注册.
- MultiTypePool :
- 将不同ViewType的Provider保存在一个SparseArrayCompat里面,在对应Adapter的生命周期里面调用create和bind等相关方法。
- AbsItemProvider :
- Adapter和ViewHolder的桥梁, 涉及到一些具体业务上的参数或者接口调用,都可以通过此来中转。
- ViewTypeConstant :
- 保存不同Adapter的ViewType,每一个Adapter都可以其中新增一个child。
- ViewHolder :
- 实现具体的item相关的视图改变,以及数据绑定。
最后
,
- 如果有什么疑问,或者代码有什么更好的建议,欢迎私信或者直接留言,或者Github上提issue,愿大家一同进步,嘿嘿。