基于 BaseRecyclerViewAdapterHelper 4.x 的封装

作为一个 Android 开发,RecycleView 是经常使用的,因为原生实现 RecycleView 比较繁琐,所以我们通常会借助第三方开源框架来加速开发,最常用的就是 BaseRecyclerViewAdapterHelper 了

https://github.com/CymChad/BaseRecyclerViewAdapterHelperhttps://github.com/CymChad/BaseRecyclerViewAdapterHelper

implementation "io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.6"

 文档中的使用示例:

 优化后的用法:

class TestAdapter : BaseQuickAdapter<DataBean, TestAdapter.VH>() {

    override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH {
        val binding = LayoutBinding.inflate(LayoutInflater.from(parent.context))
        return VH(binding)
    }

    override fun onBindViewHolder(holder: VH, position: Int, item: DataBean?) {
        item ?: return
        // 设置 item 数据
        holder.binding.xxxx
    }

    class VH(val binding: LayoutBinding) : BaseViewHolder(binding.root)
}

可以看到使用 BaseQuickAdapter 来开发已经非常方便了,但是还可以封装一下:

使用 ViewBinding 的情况下,在 Adapter 中只需要关注两样事情:list 数据的类型,item 布局的数据绑定

所以 onCreateViewHolder 方法和 VH 类可以通过泛型提取出来,并且把 ViewBinding 暴露出去


abstract class KQuickAdapter<T : Any, VB : ViewBinding> : BaseQuickAdapter<T, VH<VB>>() {

    override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH<VB> {
        val vbClass = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[1] as Class<VB>
        val method = vbClass.getMethod("inflate", LayoutInflater::class.java, ViewGroup::class.java, Boolean::class.java)
        val binding = method.invoke(null, LayoutInflater.from(context), parent, false) as VB
        return VH(binding)
    }

    override fun onBindViewHolder(holder: VH<VB>, position: Int, item: T?) {
        item ?: return
        onBind(holder.binding, position, item)
    }

    abstract fun onBind(binding: VB, position: Int, item: T)
}
class VH<VB : ViewBinding>(val binding: VB) : RecyclerView.ViewHolder(binding.root)

使用方法:

class TestAdapter: KQuickAdapter<DataBean, LayoutBinding>() {

    override fun onBind(binding: LayoutBinding, position: Int, item: DataBean) {
        // 设置 item 数据
        binding.xxxxx
    }
}

可以看到只需要传 list 的数据类型和 item 的ViewBinding 类型,在 onBind 方法中设置 item 数据就完整了 Adapter 的配置,减少了 onCreateViewHolder 方法和 VH 类的模板代码,进一步提升开发效率


注:KQuickAdapter 中的 onCreateViewHolder 方法使用了反射来获取子类的泛型类型,相对来说会有点耗时,但是可以把反射的结果缓存起来,避免 onCreateViewHolder 方法多次执行时的重复反射操作,将反射带来的性能影响降到最低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值