Skip to content

多人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);
}

1.int getComponentId(int type)

这里要区分一下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;
}

2.Class<?> attachClass(int 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;
}

3.Object getBindItem(int pos, T t);

经常我们一个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