BaseRecyclerViewAdapterHelper开源项目之BaseSectionQuickAdapter 实现分组效果的源码学习

本文介绍了BaseRecyclerViewAdapterHelper开源项目中的BaseSectionQuickAdapter如何实现分组效果。通过分析源码,展示了SectionEntity类的作用,讲解了BaseSectionQuickAdapter的构造方法、getDefItemViewType、onCreateDefViewHolder和onBindViewHolder的实现,特别提到了setFullSpan方法在StaggeredGridLayoutManager中的应用,并解释了getLayoutPosition的用途。文章旨在帮助读者理解分组RecyclerAdapter的工作原理。
摘要由CSDN通过智能技术生成

version:2.8.5 

更多分享请看:http://cherylgood.cn

今天我们来学习下BaseRecyclerViewAdapterHelpler开源项目中是如何实现分组想过的。

首先今天的学习我们还是按照前面的学习思路,根据getItemViewType->onCreateDefViewHolder->onBindViewHolder,即从确认viewholder类型->根据类型值创建viewholder->根据数据源类型绑定数据到viewholder上。

第一步:我们看一下BaseSectionQuickAdapter这个类的定义

public abstract class BaseSectionQuickAdapter extends BaseQuickAdapter<T, K> {
   

跟前面分析的多类型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中,我们帮用户多做点事,为其提供两个构造方法,一个时分组头,一个是分组体。而此时如果是定义成接口类,是不符合需求的,因为接口类的方法不能有方法体等。

SectionEntity代码分析:从源码可以看出,假如我们当前数据是分组头,那么我们在创建bean时使用

 public SectionEntity(boolean isHeader, String header) {
   
        this.isHeader = isHeader;
        this.header = header
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值