BaseRecyclerViewAdapterHelper源码解读(六) 分组布局
来源:互联网 发布:人体检测软件 编辑:程序博客网 时间:2024/06/06 03:13
分组布局
分组布局的话,在平时使用的频率超级高.所以非常重要.
此篇文章为BaseRecyclerViewAdapterHelper源码解读第六篇,开源库地址,如果没有看过之前5篇文章的同学可以先去看看,大神可直接跳过.
BaseRecyclerViewAdapterHelper源码解读(一) 封装简单的adapter和万能的BaseViewHolder
BaseRecyclerViewAdapterHelper源码解读(二) 添加header和footer
BaseRecyclerViewAdapterHelper源码解读(三) 添加动画
BaseRecyclerViewAdapterHelper源码解读(四) 上拉加载更多
BaseRecyclerViewAdapterHelper源码解读(五) header和footer完善
使用方法
实体类必须继承SectionEntity
public class MySection extends SectionEntity<Video> { private boolean isMore; public MySection(boolean isHeader, String header) { super(isHeader, header); } public MySection(Video t) { super(t); }}
我的理解:上面的Video是实体类,MySection是包装Video的实体类,之所以这样做,是为了让实体类Video可以去继承其他类,这样就不影响实体类了.
adapter构造需要传入两个布局id,第一个是item的,第二个是head的,在convert方法里面加载item数据,在convertHead方法里面加载head数据
public SectionAdapter(int layoutResId, int sectionHeadResId, List data) { super(layoutResId, sectionHeadResId, data); } @Override protected void convert(BaseViewHolder helper, MySection item) { helper.setImageUrl(R.id.iv, (String) item.t); } @Override protected void convertHead(BaseViewHolder helper,final MySection item) { helper.setText(R.id.header, item.header); helper.setOnClickListener(R.id.more, new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context,item.header+"more..",Toast.LENGTH_LONG).show(); } }); }
实体类的公有抽象父类SectionEntity
public abstract class SectionEntity<T> implements Serializable { /** * 是否是分组header */ public boolean isHeader; /** * 包装的实体类,可以没有 */ public T t; /** * 分组header标题 */ 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; }}
首先,我们有了这个抽象的父类之后,需要实现分组的列表的实体类就必须继承自该抽象父类,然后我们在BaseSectionQuickAdapter中才好根据实体类里面的属性isHeader来分辨是否是header.
单独为分组布局定做一个BaseAdapter
public abstract class BaseSectionQuickAdapter<T extends SectionEntity, K extends BaseViewHolder> extends BaseQuickAdapter<T, K> { /** * 分组header布局id */ protected int mSectionHeadResId; /** * 分组header类型 */ protected static final int SECTION_HEADER_VIEW = 0x00000444; /** * Same as QuickAdapter#QuickAdapter(Context,int) but with * some initialization data. * * @param layoutResId The layout resource id of each item. * @param sectionHeadResId The section head layout id for each item * @param data A new list is created out of this one to avoid mutable list */ public BaseSectionQuickAdapter(int layoutResId, int sectionHeadResId, List<T> data) { super(layoutResId, data); this.mSectionHeadResId = sectionHeadResId; } @Override protected int getDefItemViewType(int position) { //item的类型 根据实体类里的一个属性 分组RecyclerView里,要么是分组header,要么是普通item return mData.get(position).isHeader ? SECTION_HEADER_VIEW : 0; } @Override protected K onCreateDefViewHolder(ViewGroup parent, int viewType) { //创建ViewHolder 如果是分组header,那么view是mSectionHeadResId加载出来的 if (viewType == SECTION_HEADER_VIEW) return createBaseViewHolder(getItemView(mSectionHeadResId, parent)); //分组内的item,则用默认的方法创建ViewHolder return super.onCreateDefViewHolder(parent, viewType); } @Override protected boolean isFixedViewType(int type) { //分组header也是特殊布局,也需要进行跨格子(在GridLayoutManager中,比如SpanCount为2,那么分组header的跨度就是2) return super.isFixedViewType(type) || type == SECTION_HEADER_VIEW; } @Override public void onBindViewHolder(K holder, int position) { switch (holder.getItemViewType()) { case SECTION_HEADER_VIEW: //如果是分组header,那么需要设置为满Span 即占满 setFullSpan(holder); //绑定数据 这是分组header convertHead(holder, getItem(position - getHeaderLayoutCount())); break; default: super.onBindViewHolder(holder, position); break; } } /** * 分组header绑定数据 * * @param helper ViewHolder * @param item 实体类 */ protected abstract void convertHead(K helper, T item);}
这里代码不多,我就直接全部拿出来了.
我们的这个BaseSectionQuickAdapter是继承的BaseQuickAdapter这样的话就不必重写一个重复的方法,可以专注于分组的逻辑.
1. 首先,外界需要通过构造方法传入分组header的布局id,这点无需解释,肯定是需要的.
2. 因为分组header也只是普通的item,特殊的item是headerView,footerView,emptyView,loadMoreView;所以在getDefItemViewType()里面根据实体类里的isHeader属性来区分是分组header类型还是普通item类型.
3. 上面获取了该索引处的type之后,在onCreateDefViewHolder()的时候,就可以直接通过创建分组header所对应的ViewHolder,创建ViewHolder时传入的View是通过mSectionHeadResId创建出来的.
4. 当使用GridLayoutManager时需要将分组header的跨度设置为SpanCount,即占满.所以需要在isFixedViewType()将分组header加上.
5. 绑定数据:当我们在onBindViewHolder()中绑定数据时,需要增加一种类型,就是分组header,用convertHead()暴露给外界调用者去绑定数据.
- BaseRecyclerViewAdapterHelper源码解读(六) 分组布局
- BaseRecyclerViewAdapterHelper源码解读(七) 多布局
- BaseRecyclerViewAdapterHelper源码解读(八) 空布局
- BaseRecyclerViewAdapterHelper源码解读(三) 添加动画
- BaseRecyclerViewAdapterHelper源码解读(二) 添加header和footer
- BaseRecyclerViewAdapterHelper源码解读(四) 上拉加载更多
- BaseRecyclerViewAdapterHelper源码解读(五) header和footer完善
- BaseRecyclerViewAdapterHelper开源项目之BaseSectionQuickAdapter 实现分组效果的源码学习
- RecyclerView分组之BaseRecyclerViewAdapterHelper(实现分组功能)
- BaseRecyclerViewAdapterHelper源码解读(一) 封装简单的adapter和万能的BaseViewHolder
- BaseRecyclerViewAdapterHelper之BaseSectionQuickAdapter实现分组功能
- BaseRecyclerViewAdapterHelper
- BaseRecyclerViewAdapterHelper
- jemalloc源码解读(六)基数树
- AFNetwork 3.0 源码解读(六)AFURLSessionManager
- JQuery3.1.1源码解读(六)【compile】
- jemalloc源码解读(五)内存布局
- [Hadoop源码解读](六)MapReduce篇之MapTask类
- 第一章 概述
- JS HTTP 请求终极解决方案
- 数据库之where子句以及函数
- spring cloud与K8S
- 购物车增删改查,正序倒序,批量删除
- BaseRecyclerViewAdapterHelper源码解读(六) 分组布局
- lianxi1
- gcd和lcm
- C# 反射和特性简介
- Bulma 教程,Bulma 指南,Bulma 实战,Bulma 中文手册
- cmd开启、关闭oracle数据库命令
- Baseframent
- android 智能指针总结
- Dubbo是什么?