首页 > 解决方案 > RecyclerView 适配器中的 OnClickListener 未初始化

问题描述

我正在尝试将 OnClickListener 添加到回收站视图项中,但是我不断收到此错误

lateinit property listener has not been initialized

这是我的适配器的样子

class CartAdapter(private val cartItems: List<CartItemEntity>? = null) : RecyclerView.Adapter<CartAdapter.CartViewHolder>() {

    private lateinit var listener: OnItemClickListener

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CartViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.cart_item, parent, false)
        return CartViewHolder(view, cartItems!!, listener)
    }

    override fun getItemCount() = cartItems!!.size

    override fun onBindViewHolder(holder: CartViewHolder, position: Int) {
        val cartItem = cartItems?.get(position)
        holder.productPrice.text = cartItem.productPrice.toInt().toString()
        holder.cart = listOf(cartItem)
    }

    class CartViewHolder(val view: View, var cart: List<CartItemEntity>, listener: OnItemClickListener) : RecyclerView.ViewHolder(view) {
        private val cartRemove: TextView = view.findViewById(R.id.cartRemove)

        init {
            cartRemove.setOnClickListener {
                listener.onItemClick(cart)
            }

        }
    }

    interface OnItemClickListener{
        fun onItemClick(cartItems: List<CartItemEntity>?)
    }

    fun setOnItemClickListener(listener: OnItemClickListener){
        this.listener = listener
    }

}

这就是我在我的片段中实现它的方式

adapter!!.setOnItemClickListener(object : CartAdapter.OnItemClickListener{
            override fun onItemClick(cartItems: List<CartItemEntity>?) {
                Log.e("Cart Item", ""+ cartItems!![0].id)
            }
        })

不知道做错了什么

标签: androidkotlinandroid-recyclerview

解决方案


您可以将侦听器添加为CartAdapter构造函数的一部分

class CartAdapter(private val cartItems: List<CartItemEntity>? = null, itemListener: OnItemClickListener) : RecyclerView.Adapter<CartAdapter.CartViewHolder>() {

    private val listener: OnItemClickListener = itemListener

    ...

    interface OnItemClickListener{
        fun onItemClick(cartItems: List<CartItemEntity>?)
    }
}

然后从您的活动中,在初始化适配器时传递侦听器

    val adapter = CartAdapter(itemList, object: CartAdapter.OnItemClickListener {
        override fun onItemClick(cartItems: List<CartItemEntity>?) {
            Log.e("Cart Item", ""+ cartItems!![0].id)
        }
    })

推荐阅读