QuickAdapter使用详解-快速构建RecyclerViewAdapter

QuickAdapter是什么东西呢,顾名思义就是快速构建RecyclerViewAdapter。

 那此组件有什么特点:

快速构建Adapter,集成QuickViewHolder,快速绑定数据,配置itemView,margin,padding灵活,设置OnItemClickListener、OnItemLongLister,并且可单独设置ItemView内的View点击事件OnClickListener,扩展灵活,代码兼容

接下来我们看一下正常写法:

class Adapter2 : RecyclerView.Adapter<Adapter2.ViewHolder>() {
        private val dataList = mutableListOf<String>()
        private var onClickListener: ((position: Int, holder: ViewHolder) -> Unit?)? = null

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.dialog_test, null))
        }

        override fun getItemCount(): Int = dataList.size

        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            holder.titleTv.text = dataList[position]
            /*设置点击事件*/
            holder.itemView.setOnClickListener {
                if (onClickListener != null) onClickListener?.invoke(position, holder)
            }
        }

        fun setOnItemClickListener(onClickListener: (position: Int, holder: ViewHolder) -> Unit?) {
            this.onClickListener = onClickListener
        }

        inner class ViewHolder : RecyclerView.ViewHolder {
            lateinit var titleTv: TextView
            lateinit var userNameTv: TextView
            lateinit var ageTv: TextView
            lateinit var contentTv: TextView
            lateinit var coverIv: ImageView
            ...

            constructor(itemView: View) : super(itemView) {
                titleTv = itemView.findViewById(R.id.titleTv)
                userNameTv
                ageTv
                contentTv
                coverIv
                ...
            }
        }

    }

简单的列表,标准写法大概就如此了。

接下来看下QuickAdapter的写法,你会大吃一惊的

class Adapter : QuickAdapter<Int, QuickViewHolder>() {
        override fun onBindData(holder: QuickViewHolder, position: Int, itemData: Int,viewType: Int) {
            holder.setImgCircle(R.id.iv, itemData)
        }

        override fun onResultLayoutResId(viewType: Int): Int = R.layout.item_rv_list
    }

只需要重写必要的两个方法即可,如此就完成了一个Adapter,代码量非常少,省力省心省时。

接下来我们假设几种使用场景

如果列表是CardView,那就需要设置margin来配合了。

        override fun onResultItemMargin(): Float {
            return super.onResultItemMargin()
        }

 只需要重写这一个方法就可以了设置上下左右的margin。像这样子的

如果有需求要求显示多纵列,他们之前还要有间隔,这时候就需要单独设置margin了,否则显示效果就是全挤在一起

        override fun onResultItemMarginLeft(position: Int): Float {
            return super.onResultItemMarginLeft(position)
        }

        override fun onResultItemMarginRight(position: Int): Float {
            return super.onResultItemMarginRight(position)
        }

        override fun onResultItemMarginTop(position: Int): Float {
            return super.onResultItemMarginTop(position)
        }

        override fun onResultItemMarginBottom(position: Int): Float {
            return super.onResultItemMarginBottom(position)
        }

像这样子的

都到这儿了,不妨我们再扩展一下,列表里面将展示多种Layout,那这应当如何处理呢?直接上代码

class Adapter : QuickAdapter<Int, QuickViewHolder>() {

        override fun onBindData(holder: QuickViewHolder, position: Int, itemData: Int, viewType: Int) {
            when (viewType) {
                1 -> {//绑定书的数据

                }
                2 -> {//绑定作者的数据

                }
            }
        }

        override fun getItemViewType(position: Int): Int = when (getItem(position)) {
            123 -> {//展示书
                1
            }
            456 -> {//展示作者
                2
            }
            else -> 1
        }
        

        override fun onResultLayoutResId(viewType: Int): Int = when (viewType) {
            1 -> {//绑定书的Layout
                R.layout.app_toast
            }
            2 -> {//绑定作者的Layout
                R.layout.dialog_test
            }
            else -> {//绑定书的Layout
                R.layout.app_toast
            }
        }
    }

 我们通过重写getItemViewType获取model中的数据,判断当前Layout的类型,然后在onResultLayoutResId中返回对应的Layout,最后根据在onBindData中根据类型绑定数据即可。一共三步完成了这种复杂的使用场景

接下来是自定义,改造成自己喜欢的样子

只需要继承QuickAdapter重写OnResultViewHolder基本就可以了

abstract class BaseAdapter<M> : QuickAdapter<M, BaseViewHolder>() {
    override fun onResultViewHolder(itemView: View): BaseViewHolder = BaseViewHolder(itemView)
}

 如此使用时就可以少传一个泛型,并且将ViewHolder替换为了自己自定义的

如何设置监听?直接上代码

1、设置整个item的点击事件

//设置整个item的点击事件
adapter.setOnItemClickListener { view, viewHolder, position, itemData ->

}

2、 设置整个item的长按事件

//设置整个item的长按事件
adapter.setOnItemLongClickListener { view, viewHolder, position, itemData ->

    true
}

3、设置item内的View点击事件

//设置item内的View点击事件
adapter.setOnClickListener({ view, viewHolder, position, itemData ->

}, R.id.checkBox1, R.id.checkBox2, R.id.checkBox3)

4、设置item内的View选择事件

//设置item内的View选择事件
adapter.setOnCheckedChangedListener({ view, viewHolder, isChecked, position, itemData ->
            
}, R.id.btn1, R.id.btn2, R.id.btn3)

如果设置数据呢?

1、初始化数据

adapter.setDataList(dataList)

2、添加单个数据

adapter.add(item)

3、添加数据列表

adapter.addDataList(dataList)

4、移除数据

adapter.remove(1)
adapter.removeAll()

简单使用是不是非常简洁方便,而复杂使用也是比较灵活的。代码量省了许多,省心。

end---------

推荐使用gradle接入

implementation 'org.quick.android:quick-component:latest.release'

源码地址:https://github.com/SpringSmell/quick-component

好了,到这里就结束,好东西那当然要分享了,马上告诉小伙伴我发现了一个很酷的东西吧

QuickAndroid系列全家桶

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值