ReyclerView.Adapter基类封装(Kolin)

238 阅读1分钟

abstract class BaseQuickAdapter(var mList: ArrayList = arrayListOf()) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { abstract fun getLayoutId(): Int

protected open fun initView(bean: T, itemView: View, position: Int) {
    itemView.setOnClickListener {
        itemClick(bean, position)
    }
}

lateinit var itemClick: (T, Int) -> Unit

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    val view = LayoutInflater.from(parent.context).inflate(getLayoutId(), parent, false)
    return BaseViewHolder(view)
}

inner class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    fun bindToItem(bean: T) {
        initView(bean, itemView, adapterPosition)
    }
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    (holder as BaseQuickAdapter<T>.BaseViewHolder).bindToItem(mList[position])
}


override fun getItemCount(): Int {
    return mList.size
}

fun update(list: List<T>) {
    if (list.size < 0)
        return
    mList.apply {
        if (size > 0) clear()
        addAll(list)
        notifyDataSetChanged()
    }
}

fun addData(list: List<T>) {
    mList.addAll(list)
    notifyDataSetChanged()
}

fun addData(item: T) {
    mList.add(item)
    notifyDataSetChanged()
}

} lateinit var itemClick: (T, Int) -> Unit相当于java里的onCliListener接口.

实际使用: 直接实例化对象就行了 TestAdapter()
list已经封装在内部,也可以传入list参数。 注意:需要实现itemClick,不然点击item会闪退 例子: itemClick={b,i-> //test() }

class TestAdapter():BaseQuickAdapter { override fun getLayoutId(): Int { return R.layout.item_test }

override fun initView(bean: TestBean, itemView: View, position: Int) {
    super.initView(bean, itemView, position)
    bean.apply{
        itemView.apply { 
            tv_title=bean.title
        }
    }
}

}