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 lateinit属性侦听器尚未初始化_Android_Kotlin_Android Recyclerview - Fatal编程技术网

Android lateinit属性侦听器尚未初始化

Android lateinit属性侦听器尚未初始化,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,我试图将onclick侦听器添加到一个recyclerview项,但是我不断收到一个错误,该错误表示侦听器尚未初始化,但已初始化,我做错了什么 注意:recycler视图是一个嵌套的recyclerview,我正在将onclick添加到子recyclerview 下面是我的适配器的外观 class ProductAdapter(private val productModel: List<Product>): RecyclerView.Adapter<ProductAdapte

我试图将onclick侦听器添加到一个recyclerview项,但是我不断收到一个错误,该错误表示侦听器尚未初始化,但已初始化,我做错了什么

注意:recycler视图是一个嵌套的recyclerview,我正在将onclick添加到子recyclerview

下面是我的适配器的外观

class ProductAdapter(private val productModel: List<Product>): RecyclerView.Adapter<ProductAdapter.ProductView>(){

    private lateinit var listener: OnItemClickListener

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductView {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.product_item, parent, false)
        return ProductView(view, productModel, listener)
    }

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

    override fun onBindViewHolder(holder: ProductView, position: Int) {
        var product = productModel[position]
        //
        holder.product = listOf(product)

    }

    class ProductView(itemView: View, var product: List<Product>, listener: OnItemClickListener) : RecyclerView.ViewHolder(itemView){
        //

        init {
            itemView.setOnClickListener {
                listener.onButtonClick(product[0])
            }
        }

    }

    interface OnItemClickListener{
        fun onButtonClick(productModel: Product)
    }

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

}
更新:我将侦听器设置为空,我不再收到错误,但单击不会记录任何内容

private var listener: OnItemClickListener? = null

在使用侦听器之前,需要初始化它。您正在
onCreateViewHolder()
中使用它。在将
ProductAdapter
附加到
RecyclerView
之前,请确保初始化了
listener
,而不是使用
setOnItemClickListener()
,您可以在构造适配器时打开listener。这将确保您始终为适配器设置click listener:

class ProductAdapter(private val productModel: List<Product>, listener: OnItemClickListener): RecyclerView.Adapter<ProductAdapter.ProductView>(){
    // ...
}

这里的主要问题是,在构造函数中将
listener
传递给
ProductView
,并在
init
块中使用它,在设置
listener
之前,该块从
onCreateViewHolder
调用

所以要解决这个问题,你有两个选择

1-使
listener
为空,并在需要时将其设置为空,例如

private var listener: OnItemClickListener?
那么当你使用它的时候

class ProductView(itemView: View, var product: List<Product>, listener: OnItemClickListener?) : RecyclerView.ViewHolder(itemView){
        val foodImg: ImageView = itemView.findViewById(R.id.foodImg)
        val foodName: TextView = itemView.findViewById(R.id.foodName)
        val foodDesc: TextView = itemView.findViewById(R.id.foodDesc)
        val foodPrice: TextView = itemView.findViewById(R.id.foodPrice)
        private val addToCart: ImageView = itemView.findViewById(R.id.addToCart)
        private lateinit var repository: MainRepository


        init {
            itemView.setOnClickListener {
                listener?.onButtonClick(product[0])
            }
        }

    }
您可以像这样初始化适配器

val adapter = ProductAdapter(productModel, object : ProductAdapter.OnItemClickListener {
            override fun onButtonClick(productModel: Product) {
                Log.v("Clicked", ""+productModel.productName)

            }

        })

实际上,我更喜欢第二种选择。

嘿,非常感谢,我已经实现了这一点,它不再具有破坏性,但是什么都没有发生,什么都没有记录。如果使用第1种方法,您可以添加productAdapter吗?.setOnItemClickListener(对象:productAdapter.OnItemClickListener{override fun onButton单击(productModel:Product){Log.v(“单击的“,”+productModel.productName)})在直接启动适配器后,我正在使用第二种方法,很抱歉,我没有提到您是否删除了私有lateinit var listener:OnItemClickListener?是的,我删除了它们,非常感谢。是的,我已经这样做了,但是现在没有记录任何内容,eeror已经消失
private var listener: OnItemClickListener?
class ProductView(itemView: View, var product: List<Product>, listener: OnItemClickListener?) : RecyclerView.ViewHolder(itemView){
        val foodImg: ImageView = itemView.findViewById(R.id.foodImg)
        val foodName: TextView = itemView.findViewById(R.id.foodName)
        val foodDesc: TextView = itemView.findViewById(R.id.foodDesc)
        val foodPrice: TextView = itemView.findViewById(R.id.foodPrice)
        private val addToCart: ImageView = itemView.findViewById(R.id.addToCart)
        private lateinit var repository: MainRepository


        init {
            itemView.setOnClickListener {
                listener?.onButtonClick(product[0])
            }
        }

    }
class ProductAdapter(private val productModel: List<Product>, private val listener: OnItemClickListener): RecyclerView.Adapter<ProductAdapter.ProductView>(){
 private lateinit var listener: OnItemClickListener //remove this listener
.....

}
val adapter = ProductAdapter(productModel, object : ProductAdapter.OnItemClickListener {
            override fun onButtonClick(productModel: Product) {
                Log.v("Clicked", ""+productModel.productName)

            }

        })