Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RecyclerView适配器中的OnClickListener未初始化_Android_Kotlin_Android Recyclerview - Fatal编程技术网

Android RecyclerView适配器中的OnClickListener未初始化

Android RecyclerView适配器中的OnClickListener未初始化,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,我正在尝试将OnClickListener添加到回收器视图项,但我一直收到此错误 lateinit property listener has not been initialized 下面是我的适配器的外观 class CartAdapter(private val cartItems: List<CartItemEntity>? = null) : RecyclerView.Adapter<CartAdapter.CartViewHolder>() { p

我正在尝试将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
    }

}
class CartAdapter(private val cartItems:List?=null):RecyclerView.Adapter(){
私有lateinit变量侦听器:OnItemClickListener
重写CreateViewHolder(父级:ViewGroup,viewType:Int):CartViewHolder{
val view=LayoutInflater.from(parent.context)。充气(R.layout.cart\u项目,父项,false)
返回CartViewHolder(视图,cartItems!!,侦听器)
}
重写fun getItemCount()=cartItems!!.size
覆盖BindViewHolder(支架:CartViewHolder,位置:Int){
val cartItem=cartItems?获取(位置)
holder.productPrice.text=cartItem.productPrice.toInt().toString()
holder.cart=listOf(cartItem)
}
类CartViewHolder(val视图:视图,var购物车:列表,侦听器:OnItemClickListener):RecyclerView.ViewHolder(视图){
private val cartRemove:TextView=view.findViewById(R.id.cartRemove)
初始化{
cartRemove.setOnClickListener{
listener.onItemClick(购物车)
}
}
}
接口侦听器{
有趣的McClick(cartItems:列表?)
}
有趣的setOnItemClickListener(监听器:OnItemClickListener){
this.listener=listener
}
}
这就是我在片段中实现它的方式

adapter!!.setOnItemClickListener(object : CartAdapter.OnItemClickListener{
            override fun onItemClick(cartItems: List<CartItemEntity>?) {
                Log.e("Cart Item", ""+ cartItems!![0].id)
            }
        })
适配器!!。setOnItemClickListener(对象:CartAdapter.OnItemClickListener{
覆盖McClick(cartItems:列表?){
Log.e(“购物车项目”,“购物车项目”![0].id)
}
})

不确定我做错了什么

在适配器内创建构造函数

  public Adapter(ListenerAdapter click) {
    this.click = click;
}
并在创建recyclerView时从片段发送对象

private void initRecyclerView(View view) {
    adapter = new Adapter(this);}   
在我的例子中,我创建了ViewHolder另一个类,我还必须将侦听器发送给ViewHolder,如下所示

 @NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View view = inflater.inflate(R.layout.item_main_activity, parent, false);
    // we send part of ListenerAdapter to ViewHolder
    return new ViewHolder(view,click);
}

您可以将侦听器添加为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>?)
    }
}
class CartAdapter(私有val cartItems:List?=null,itemListener:OnItemClickListener):RecyclerView.Adapter(){
私有val侦听器:OnItemClickListener=itemListener
...
接口侦听器{
有趣的McClick(cartItems:列表?)
}
}
然后从活动中,在初始化适配器时传递侦听器

    val adapter = CartAdapter(itemList, object: CartAdapter.OnItemClickListener {
        override fun onItemClick(cartItems: List<CartItemEntity>?) {
            Log.e("Cart Item", ""+ cartItems!![0].id)
        }
    })
val adapter=CartAdapter(项目列表,对象:CartAdapter.OnItemClickListener{
覆盖McClick(cartItems:列表?){
Log.e(“购物车项目”,“购物车项目”![0].id)
}
})

嘿,我已经在Kotlin中实现了这一点。仍然会带来同样的问题