BaseRecyclerViewAdapterHelper源码解读(六) 分组布局

分组布局

分组布局的话,在平时使用的频率超级高.所以非常重要.

此篇文章为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()暴露给外界调用者去绑定数据.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容较大,权限不够,故将内容分为个部分,需要的请自行下载。 教程版权归原作者所有,本人只是负责搜集整理,本人不承担任何技术及版权问题。教程仅提供学习参考,不得用于商业用途,请在下载后在24小时内删除。 目录: 0001-2科技发展有限公司升级版源码 0001科技发展有限公司修正版源码 0002机械配件制造销售公司修正版源码 0003家具地板公司修正版源码 0004-1机械有限公司修正版源码 0004机械有限公司修正版源码 0005机械产品公司修正版源码 0006绿色环保集团股份有限公司优化版 0007金属材料制品公司修正版源码 0008电气股份有限公司修正版源码 0009红色风格设备有限公司修正版源码 0010蓝色仪表配件有限公司优化版 0011装修公司网站系统修正版源码 0012环保工程企业网站修正版源码 0013国际集团股份有限公司修正版源码 0014蓝色汽车配件有限公司修正版源码 0015家俱集团有限公司源码 0016典雅地板家居网站源码 0017蓝色企业网站系统二 0018国际集团机械仪器公司修正版源码次优化版 0019红色风格企业网站系统优化版 0020机械设备公司修正版源码 0021蓝色环保工程企业网站系统修正版源码 0022国际集团电子科技公司修正版源码 0023国际集团机械电子公司修正版源码 0024美工超级漂亮的ASP卫生纸公司修正版源码 0025绿色环境保护工程公司修正版源码 0026绿色环保生态园林公司修正版源码 0028蓝色机械制造科技公司优化版 0029装修装饰公司企业网站修正版源码 0030绿色风格酒店网站修正版源码 0031机械制造网站修正版源码 0032蓝色机械制造公司修正版源码 0033机械设备制造公司修正版源码 0034ASP机械制造企业修正版源码 0035红色汽车配件公司网站修正版源码 0036机械制造企业修正版源码 0037机械设备公司修正版源码 0038浅蓝色电子科技公司修正版源码 0039机械制造公司企业网站修正版源码 0040国际集团机械有限公司修正版源码 0041机械设备公司优化版 0042机械企业修正版源码 0043机械设备有限公司修正版源码 0044红色机械设备有限公司修政版源码 0045汽车配件制造公司修正版源码 0046蓝色汽配公司修正版源码 0047绿色园林环保公司优化版 0048红色机械化工公司修正版源码 0049机械设备有限公司修正版源码 0051测试完整无错的经典万能企业站程序 0052某电气工程有限公司源码 0053优乐博特自动化工程有限公司网站源码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值