version:2.8.5
今天我们来学习下BaseRecyclerViewAdapterHelpler开源项目中是如何实现分组想过的。
首先今天的学习我们还是按照前面的学习思路,根据getItemViewType->onCreateDefViewHolder->onBindViewHolder,即从确认viewholder类型->根据类型值创建viewholder->根据数据源类型绑定数据到viewholder上。
第一步:我们看一下BaseSectionQuickAdapter这个类的定义
public abstract class BaseSectionQuickAdapter extends BaseQuickAdapter {
跟前面分析的多类型BaseMultiItemQuickAdapter差不多,只是我们的数据源需要继承自SetionEntity。那么这个SetionEntity做了什么事呢,我们来看下源码:
package com.chad.library.adapter.base.entity;
/**
* https://github.com/CymChad/BaseRecyclerViewAdapterHelper
*/
public abstract class SectionEntity {
public boolean isHeader;
public T t;
public String header;
public SectionEntity(boolean isHeader, String header) {
this.isHeader = isHeader;
this.header = header;
this.t = null;
}
public SectionEntity(T t) {
this.isHeader = false;
this.header = null;
this.t = t;
}
}
从源码可以看出,他是一个抽象类,可能你会问,为什么要定义成抽象类呢,为什么不定义成接口或者普通类呢。
以下理由仅由我意想得出,大家也可以发表下自己的看法:
1、我们定义SectionEntity这个类,目的自然是希望用户的bean都具有某些规范,而我们的BaseSectionQuickAdapter将根据该规范进行数据的处理。虽然使用普通类一样能达到相同的效果,但是不推荐,我觉得这让有可能会让用户忽略我们所需要让用户知道的规范。
2、接口类,接口类其实是特殊的抽象类,上次分析的MultiItemEntity为什么又定义成接口类型呢,
public interface MultiItemEntity {
int getItemType();
}
根据实际需求而定,因为我们在实现多类型时,只需要用户的数据源提供一个类型值给我们即可,所以此时定义成接口类是最为合适的,因为用户数据源只要实现了该接口,他必须实现接口的方法,而我们需要的恰恰是在使用时调用该接口即可。
但是在SetionEntity中,我们帮用户多做点事,为其提供两个构造方法,一个时分组头,一个是分组体。而此时如果是定义成接口类,是不符合需求的,因为接口类的方法不能有方法体等。<