foreword
It is often encountered that the list is nested in the list, then the parent item and the child item will have overlapping clicks. How to deal with it?
first effect
父adapter
open class StoreListAdapter(layoutResId: Int, data: MutableList<StoreGoodsBean>): BaseQuickAdapter<StoreGoodsBean, BaseViewHolder>(layoutResId, data) {
//子adapter
private lateinit var goodsListAdapter: StoreGoodsListAdapter
private var mOnChildItemChildClickListener: OnChildItemChildClickListener? = null
override fun convert(holder: BaseViewHolder, item: StoreGoodsBean) {
goodsListAdapter = StoreGoodsListAdapter(R.layout.fragment_cart_item_goods, arrayListOf())
goodsListAdapter.addChildClickViewIds(R.id.goodsCheckBox)
goodsListAdapter.setOnItemChildClickListener { _, view, position ->
var index = this.data.indexOfFirst { v -> v.storeCode == item.storeCode }
this.setOnChildItemChildClick(view, index, position)
}
holder.setText(R.id.storeName, item.storeName)
holder.getView<CheckBox>(R.id.storeCheckBox).isChecked = item.check!!
holder.getView<RecyclerView>(R.id.goodsItemList).run {
layoutManager = LinearLayoutManager(this.context)
adapter = goodsListAdapter
isNestedScrollingEnabled = false
}
goodsListAdapter.setList(item.goodsList)
}
protected open fun setOnChildItemChildClick(v: View, parent: Int, position: Int) {
mOnChildItemChildClickListener?.onItemChildClick(this, v, parent, position)
}
open fun setOnChildItemChildClickListener(listener: OnChildItemChildClickListener) {
this.mOnChildItemChildClickListener = listener
}
}
复制代码
子adapter
class StoreGoodsListAdapter(layoutResId: Int, data: MutableList<CartGoodsBean>): BaseQuickAdapter<CartGoodsBean, BaseViewHolder>(layoutResId, data) {
private var imageLoader: ImageLoader = CoilUtil.getImageLoader()
override fun convert(holder: BaseViewHolder, item: CartGoodsBean) {
holder.getView<ImageView>(R.id.cartGoodsImg).load(item.imgUrl, imageLoader ) {
crossfade(true)
placeholder(R.drawable.default_img)
error(R.drawable.default_img)
}
holder.getView<CheckBox>(R.id.goodsCheckBox).isChecked = item.check!!
holder.setText(R.id.cartGoodsDes, item.description)
holder.setText(R.id.cartGoodsPrice, "¥${item.price}")
}
}
复制代码
listener
open interface OnChildItemChildClickListener {
fun onItemChildClick(adapter: BaseQuickAdapter<*, *>, view: View, parentPosition: Int, position: Int)
}
复制代码
monitor on page
//点击店铺前的checkbox
cartGoodsListAdapter.setOnItemChildClickListener { _, view, position ->
when (view.id) {
R.id.storeCheckBox -> checkAllByStore(position)
}
}
//点击店铺中商品前的checkbox
cartGoodsListAdapter.setOnChildItemChildClickListener(object : OnChildItemChildClickListener {
override fun onItemChildClick(
adapter: BaseQuickAdapter<*, *>,
view: View,
parentPosition: Int,
position: Int,
) {
when (view.id) {
R.id.goodsCheckBox -> checkGoods(parentPosition, position)
}
}
})
复制代码