Android lateinit属性侦听器尚未初始化
我试图将onclick侦听器添加到一个recyclerview项,但是我不断收到一个错误,该错误表示侦听器尚未初始化,但已初始化,我做错了什么 注意:recycler视图是一个嵌套的recyclerview,我正在将onclick添加到子recyclerview 下面是我的适配器的外观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
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)
}
})