-
Notifications
You must be signed in to change notification settings - Fork 5
多人MIX模式
Drowning Coder edited this page Nov 14, 2018
·
6 revisions
当个人模式的楼层和全局模式的楼层混合时,也就是楼层打通,我们需要利用ToolKitBuilder实现IMixStrategy策略。
public interface IMixStrategy<T> {
//通过type得到真正的映射表中的ComponentId
int getComponentId(int type);
//通过Type确定对应的映射表
Class<?> attachClass(int type);
//传入ViewHolder的Bind中的实体类
Object getBindItem(int pos, T t);
}
这里要区分一下type和ComponentId,在RecyclerView中getItemType返回的Type是唯一对象,和组件一一对应,所以才有了个人模式的出现,防止多人开发时定义Type时的冲突问题。
ViewHolder | 页面 | ComponentId | type |
---|---|---|---|
ProductVH1 | ProductActivity | 1 | 1 |
ProductVH2 | ProductActivity | 2 | 2 |
ProductVH3 | ProductActivity | 3 | 3 |
CommentVH1 | CommentActivity | 1 | 1 |
CommentVH2 | CommentActivity | 2 | 2 |
CommentVH3 | CommentActivity | 3 | 3 |
CommentVH4 | CommentActivity | 4 | 4 |
而当我们需要将两个页面的楼层混和使用时,常常会以一个为准,比如
ViewHolder | 页面 | ComponentId | type |
---|---|---|---|
ProductVH1 | MixActivity | 1 | 1 |
ProductVH2 | MixActivity | 2 | 2 |
ProductVH3 | MixActivity | 3 | 3 |
CommentVH1 | MixActivity | 1 | 1+3=4 |
CommentVH2 | MixActivity | 2 | 2+3=5 |
CommentVH3 | MixActivity | 3 | 3+3=6 |
CommentVH4 | MixActivity | 4 | 4+3=7 |
当然这种转换策略我们可以自定义。
所以getComponentId(int type)
返回的就是Type->ComponentId的过程
public int getComponentId(int type) {
if (type == 5) {
return Product.PRODUCT;
}
if (type > 6) {
type -= 6;
}
return type;
}
关于绑定可以的使用可以查看个人模式 获取对应Type的Class对象。
ViewHolder | attach | 模式 | type |
---|---|---|---|
ProductVH1 | Product.class | 个人模式 | 1 |
ProductVH2 | Product.class | 个人模式 | 2 |
ProductVH3 | Product.class | 个人模式 | 3 |
CommentVH1 | Comment.class | 个人模式 | 4 |
CommentVH2 | Comment.class | 个人模式 | 5 |
CommentVH3 | Comment.class | 个人模式 | 6 |
CommentVH4 | Comment.class | 个人模式 | 7 |
BannerVH | null | 全局模式 | 8 |
@Override
public Class<?> attachClass(int type) {
if (type == 5) {
return Product.class;
}
if (type <= 4) {
return PersonModel.class;
}
return null;
}
经常我们一个RecyclerView的所有楼层对应于一种Model
ViewHolder | Model | type |
---|---|---|
ProductVH1 | Product | 1 |
ProductVH2 | Product | 2 |
ProductVH3 | Product | 3 |
CommentVH1 | Comment | 4 |
CommentVH2 | Comment | 5 |
CommentVH3 | Comment | 6 |
CommentVH4 | Comment | 7 |
需要混合使用的时候,这时候我们混合的RecyclerView的MixModel,一般有两种处理方式,继承和组合。
- 1.继承 将Comment和Product类都继承于MixModel即可
- 2.组合 MixModel持有Comment和Product的引用,这时当传入VH的时候,我们就需要做一定的判断,传入不同的对象。
@Override
public Object getBindItem(int pos, PersonModel model) {
if (model.model != null) {
return model.model;
}
if (model.product != null) {
return model.product;
}
return model;
}
实现自己的IMixStrategy策略,即可完成不同楼层之间的打通,具体可以查看Demo
欢迎Star👏~欢迎提issues和PR