大家都知道RecyclerView本身是没有实现头视图和尾视图的,但是我们也有方法。今天我们实现的是将RecyclerView变成GirdLayout布局实现头视图和尾视图。原理很简单,就是通过getItemViewType()方法将RecyclerView中所有的item进行分类,以前我们对ListView进行分组也是通过这个方法进行实现,所不同的时最后我们还要设置头视图和尾视图的占位。好了,现在我们直接进入代码讲解。
首先,我们建立一个抽象类SectionForRecyclerViewAdapter,我们在定义三个泛型<Hextends RecyclerView.ViewHolder,VH extends RecyclerView.ViewHolder,F extends RecyclerView.ViewHolder>分别继承RecyclerView.ViewHolder,其中<H>类是继承RecyclerView.ViewHolder的header视图,<VH>类是继承RecyclerView.ViewHolder的item视图,<F>类是继承RecyclerView.ViewHolder的footer视图,最后抽象类在继承RecyclerView.Adapter<RecyclerView.ViewHolder>完整的代码如下:
<pre name="code" class="java">public abstract class SectionForRecyclerViewAdapter<H extends RecyclerView.ViewHolder,
VH extends RecyclerView.ViewHolder,
F extends RecyclerView.ViewHolder>
extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
}
接下来,我们开始我们开始定义我们所需要的变量。首先定义三个分别代表三个类型的三个静态常量:
private static final int TYPE_SECTION_HEADER = -1;
private static final int TYPE_SECTION_FOOTER = -2;
private static final int TYEP_ITEM = -3;
接着定义可记录RecyclerView中每个item是属于第几组,在组中的位置数变量:
private int[] sectionForPosition = null;//第几组
private int[] positionWithInSection = null;//在组中的位置数<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
最后,我们定义RecyclerView中每个item是否是header视图,footer视图的boolean数组和总item数:
<pre name="code" class="java">private boolean[] isHeader = null;
private boolean[] isFooter = null;
private int count = 0;//总数量
好了,所有所需要的变量我们就定义好了,完整的代码如下:
<pre name="code" class="java">public abstract class SectionForRecyclerViewAdapter<H extends RecyclerView.ViewHolder,
VH extends RecyclerView.ViewHolder,
F extends RecyclerView.ViewHolder>
extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private static final int TYPE_SECTION_HEADER = -1;
private static final int TYPE_SECTION_FOOTER = -2;
private static final int TYEP_ITEM = -3;
private int[] sectionForPosition = null;//第几组
private int[] positionWithInSection = null;//在组中的位置数
private boolean[] isHeader = null;
private boolean[] isFooter = null;
private int count = 0;//总数量
}
抽象类嘛,对吧,那我们肯定是需要抽象方法的呀,那么下面我们就开始定义要被子类所实现的抽象方法:
<pre name="code" class="objc">//第一个方法,获取组数:
protected abstract int getSectionCount();
//第二个方法,获取每组item数:
protected abstract int getItemCountForSection(int section);
//第三个方法,判断是否有footer视图:
protected abstract boolean hasFooterInSection(int section);
//第四个方法,用类H创建header视图,所需参数同RecyclerView中的onCreateViewHolder一样:
protected abstract H onCreateSectionHeaderViewHolder(ViewGroup parent, int viewType);