BaseQuickAdapter好在哪里(更新中)

RecyclerView作为一个很常用,很好用的控件,使用起来………………

1.有BaseQuickAdapter之前

有BaeQuickAdapter之前,想要使用RecyclerView需要做哪些工作?

1.1自定义Adapter继承RecyclerView.Adapter

必须实现3个abstract方法:

  1. onCreateViewHolder方法

    参数:ViewGroup parent, int viewType

    用途:通过inflate创建view,传递给ViewHolder持有。可以根据viewType的不同,返回不同的ViewHolder。

    返回:自定义的ViewHolder类型的viewholder

  2. onBindViewHolder方法

    参数:viewholder,position

    用途:按照position取出item,对viewholder进行数据绑定,设置显示内容、点击等

  3. getItemCount

    用途:返回控件中要显示的数据个数

另外,一般还需要自己定义一个list,持有数据列表。当按照position取数据的时候都需要从这个列表中读取。

1.2自定义ViewHolder继承RecyclerView.ViewHolder

包含item中的元素View,或者将绑定逻辑定义在这里,以供onBindView调用。

1.3如何设置点击事件,头部尾部分割线?

2有BaseQuickAdapter之后

2.1自定义Adapter继承BaseQuickAdapter

BaseQuickAdapter比起RecyclerView.Adapter用起来要方便很多,主要体现在以下几个方面。

2.1.1不需要自己创建view,构造函数传入了layoutId

继承RecyclerView.Adapter需要自己在重写的onCreateViewHolder方法中通过inflate创建view。
这里我们根据RecyclerView中展示数据的布局样式是单一的还是多种的分为两类。
对于多种样式的需求,RecyclerView.Adapter可以创建不同的view。如果是单一样式的,使用RecyclerView.Adapter,每次都重写这个方法就显得麻烦了一些,而且每次都要重复去写很多一样的代码。

BRVAH提供了两种adapter,BaseQuickAdapter和BaseMultiItemQuickAdapter。
作为单一样式的Adapter,BaseQuickAdapter提供了很方便的设置布局方法——构造函数直接接收layoutId作为参数,不需要重复去写创建view的过程。

虽然说是单一样式,但是其实BaseQuickAdapter还可以设置头部和脚部,只要中间是单一类型就可以用。

2.1.2自定义Adapter只需要实现一个方法

作为BaseQuickAdapter的子类,只需要实现一个abstract方法——convert方法

参数:viewholder helper,T item

内容:与onBindViewHolder类似,进行数据绑定。只是这里的helper是BaseViewHolder,作者为BaseViewHolder封装了很多好用的方法,下文具体讲。

2.1.3替我们实现了3个方法

BaseQuickAdapter继承RecyclerView.Adapter,替我们实现了3个abstract方法:

  1. onCreateViewHolder

    switch (viewType),根据不同的viewType创建ViewHolder,viewType包括头部、尾部、loading、空状态和普通的数据。

    ***创建ViewHolder的方法还涉及泛型的知识。

  2. onBindViewHolder

    对于头部尾部等ViewType的数据,都不需要绑定,对于普通类型的数据,调用我们实现的convert方法即可,需要注意的是,这里传递给convert的position其实是RecyclerView.Adapter中的position去掉头部之后的。

  3. getItemCount

    考虑是否是空页面的情况,如果是空页面返回头部尾部等的个数;如果不是空页面,返回mdata的长度+头部尾部个数。

2.2方便好用的BaseViewHolder

使用BaseViewHolder继承自RecyclerView.ViewHolder,它提供了封装好的方法,供开发者方便地进行数据绑定。如果没有特殊需求,只是要进行一些控件的属性设置,不需要重新写一个新的子类去继承BaseViewHolder了。

2.2.1 一般属性类

对于不同的控件,BaseViewHolder直接提供了很多设置属性的方法。
例如对于TextView空间,可以直接调用helper.setText()对其设置text内容,传入参数为view的id和字符内容。源码:

public BaseViewHolder setText(@IdRes int viewId, CharSequence value) {
        TextView view = getView(viewId);
        view.setText(value);
        return this;
    }

其他的如imageView,CheckBox等也提供了setImageResoure/Gone/Checked等方法。

2.2.2 链式调用

通过上一小节给出的源码可以看见,setXXX方法返回的还是BaseViewHolder,所以可以链式调用,使用方便,可读性好。

2.2.3如何设置控件的点击事件和子view的点击事件

BaseViewHolder对设置控件点击事件的方法做了统一封装:addOnClickListener和addOnLongClickListener。

这两个方法的传入参数都是view的id,然后调用View的setOnClickListener和setOnLongClickListener方法给他们设置点击的回调函数,这里的回调函数是BaseQuickAdapter中的mOnItemChildClickListener和mOnItemChildLongClickListener两个函数。

private OnItemChildClickListener mOnItemChildClickListener;
private OnItemChildLongClickListener mOnItemChildLongClickListener;

所以在使用的时候需要调用BaseQuickAdapter的两个set方法:

/**
 * Register a callback to be invoked when an itemchild in View has
 * been  clicked
 *
 * @param listener The callback that will run
 */
public void setOnItemChildClickListener(OnItemChildClickListener listener) {
    mOnItemChildClickListener = listener;
}

/**
     * Register a callback to be invoked when an item in this RecyclerView has
     * been long clicked and held
     *
     * @param listener The callback that will run
     */
    public void setOnItemLongClickListener(OnItemLongClickListener listener) {
        mOnItemLongClickListener = listener;
    }

虽然也支持直接setOnClickListener给某一个view,但是作者更加推荐的是这种方法。

private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
private OnItemChildClickListener mOnItemChildClickListener;
private OnItemChildLongClickListener mOnItemChildLongClickListener;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章