基于Viewbinding封装BaseQuickAdapter

563 阅读1分钟

ViewBinding 和 BaseQuickAdapter 结合使用,废话不多说,上代码

导入第三方库

"refreshview"            : "com.shizhefei:CoolRefreshView:1.0.2",
"quick-adapter"          : "com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.10",

开启ViewBinding

android {
    ....
   
    buildFeatures {
        viewBinding = true
    }
}

封装BaseAdapter

abstract class BaseAdapter<VB : ViewBinding, T>(data: MutableList<T>? = null) :
    BaseQuickAdapter<T, VBViewHolder<VB>>(0, data), LoadMoreModule {
    override fun onCreateDefViewHolder(parent: ViewGroup, viewType: Int): VBViewHolder<VB> {
        //使用反射来获取实例ViewBinding
        val vbClass: Class<VB> =
            (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as Class<VB>
        val inflate = vbClass.getDeclaredMethod(
            "inflate",
            LayoutInflater::class.java,
            ViewGroup::class.java,
            Boolean::class.java
        )
        val itemBinding =
            inflate.invoke(null, LayoutInflater.from(parent.context), parent, false) as VB
        return VBViewHolder(itemBinding, itemBinding.root)
    }
}

class VBViewHolder<VB : ViewBinding>(val vb: VB, view: View) : BaseViewHolder(view)

实际使用

private val adapter:  BaseAdapter<ItemCityBinding, CommonBean> by lazy {
    object :
        BaseAdapter<ItemCityBinding, CommonBean>() {
        override fun convert(holder: VBViewHolder<ItemCityBinding>, item: CommonBean) {
            val itemBinding = holder.vb
            itemBinding.tvName.text = item.name
            itemBinding.btnLeft.visibleOrGone(item.name == "1")
        }
    }
}

因为对kotlin语法不熟悉,走了不少坑,目前还在优化中