lateinit 属性 onItemClickCallback 尚未初始化
lateinit property onItemClickCallback has not been initialized
我是 android 和 kotlin 的新手。我正在使用接口为我的 cardViewAdapter 创建 onclick 监听器,这样我就可以从我的 activity 覆盖它的回调。但是我在模拟器上 运行 并单击每个 itemView 时收到错误 "lateinit property onItemClick has not been initialized"。
在我的代码中,我试图在一个函数中初始化它。在此之前,我尝试了另一个人的答案
但是点击不起作用
这是我的MainActivity.kt
rvMotor.layoutManager = GridLayoutManager(this, 2)
val recycleViewAdapter = CardViewMainAdapter(listMotor)
recycleViewAdapter.setOnItemClickCallback(object : CardViewMainAdapter.OnItemClickCallback{
override fun onItemClicked(data: Motor) {
val intent = Intent(this@MainActivity, DetailActivity::class.java)
intent.putExtra(DetailActivity.EXTRA_ID, data.id)
startActivity(intent)
}
})
rvMotor.adapter = recycleViewAdapter
这是我的 CardViewMainAdapter.kt
class CardViewMainAdapter(private val listMotors: ArrayList<Motor>) :
RecyclerView.Adapter<CardViewMainAdapter.CardViewMainViewHolder>() {
private lateinit var onItemClickCallback : OnItemClickCallback
fun setOnItemClickCallback(onItemClickCallback: OnItemClickCallback){
this.onItemClickCallback = onItemClickCallback
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewMainViewHolder {
val view: View = LayoutInflater.from(parent.context).inflate(R.layout.cardview_main, parent, false)
return CardViewMainViewHolder(view)
}
override fun getItemCount(): Int {
return listMotors.size
}
override fun onBindViewHolder(holder: CardViewMainViewHolder, position: Int) {
val motor = listMotors[position]
holder.cvMainName.text = motor.name
Glide.with(holder.itemView.context)
.load(motor.image)
.apply(RequestOptions().override(350, 550))
.into(holder.cvMainImage)
holder.itemView.setOnClickListener{
onItemClickCallback.onItemClicked(listMotors[holder.adapterPosition])
}
}
inner class CardViewMainViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
var cvMainImage: ImageView = itemView.findViewById(R.id.cardview_main_img)
var cvMainName: TextView = itemView.findViewById(R.id.cardview_main_txt)
}
interface OnItemClickCallback {
fun onItemClicked(data: Motor)
}
}
根据文档: 在 lateinit 属性 初始化之前访问它会抛出一个特殊的异常,该异常清楚地标识了正在访问的 属性 和事实上它还没有被初始化。
要检查一个lateinit变量是否已经被初始化,
在 属性:
的引用上使用 .isInitialized
我不明白为什么它会导致这里出现问题。我认为你的代码没问题,但我可以为你解决问题。
对于您的情况,您可以通过两种方式解决您的问题。
1.
只需在点击侦听器中添加一个 if 条件来检查它是否被初始化。
holder.itemView.setOnClickListener{
//Check whether it is Initialized or not
if(::onItemClickCallback.isInitialized){
onItemClickCallback.onItemClicked(listMotors[holder.adapterPosition])
}
}
或
2. 删除 lateint 并使其可为空。
//Make it as nullable
private var onItemClickCallback : OnItemClickCallback? = null
holder.itemView.setOnClickListener {
holder.itemView.setOnClickListener {
// add ? for handling nullable
onItemClickCallback?.onItemClicked(listMotors[holder.adapterPosition])
}
}
我最终在适配器参数内而不是在函数中初始化了 onItemClickCallback。我以为我已经尝试过这种方式,但由于未知原因,它以前不起作用。感谢所有回复。
这是我的 activity
val recycleViewAdapter = CardViewMainAdapter(listMotor, object : CardViewMainAdapter.OnItemClickCallback{
override fun onItemClicked(data: Motor) {
val intent = Intent(this@MainActivity, DetailActivity::class.java)
intent.putExtra(DetailActivity.EXTRA_ID, data.id)
startActivity(intent)
}
})
rvMotor.adapter = recycleViewAdapter
这是我的适配器
class CardViewMainAdapter(private val listMotors: ArrayList<Motor>, private val onItemClickCallback: OnItemClickCallback) :
RecyclerView.Adapter<CardViewMainAdapter.CardViewMainViewHolder>() {
我是 android 和 kotlin 的新手。我正在使用接口为我的 cardViewAdapter 创建 onclick 监听器,这样我就可以从我的 activity 覆盖它的回调。但是我在模拟器上 运行 并单击每个 itemView 时收到错误 "lateinit property onItemClick has not been initialized"。
在我的代码中,我试图在一个函数中初始化它。在此之前,我尝试了另一个人的答案
这是我的MainActivity.kt
rvMotor.layoutManager = GridLayoutManager(this, 2)
val recycleViewAdapter = CardViewMainAdapter(listMotor)
recycleViewAdapter.setOnItemClickCallback(object : CardViewMainAdapter.OnItemClickCallback{
override fun onItemClicked(data: Motor) {
val intent = Intent(this@MainActivity, DetailActivity::class.java)
intent.putExtra(DetailActivity.EXTRA_ID, data.id)
startActivity(intent)
}
})
rvMotor.adapter = recycleViewAdapter
这是我的 CardViewMainAdapter.kt
class CardViewMainAdapter(private val listMotors: ArrayList<Motor>) :
RecyclerView.Adapter<CardViewMainAdapter.CardViewMainViewHolder>() {
private lateinit var onItemClickCallback : OnItemClickCallback
fun setOnItemClickCallback(onItemClickCallback: OnItemClickCallback){
this.onItemClickCallback = onItemClickCallback
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewMainViewHolder {
val view: View = LayoutInflater.from(parent.context).inflate(R.layout.cardview_main, parent, false)
return CardViewMainViewHolder(view)
}
override fun getItemCount(): Int {
return listMotors.size
}
override fun onBindViewHolder(holder: CardViewMainViewHolder, position: Int) {
val motor = listMotors[position]
holder.cvMainName.text = motor.name
Glide.with(holder.itemView.context)
.load(motor.image)
.apply(RequestOptions().override(350, 550))
.into(holder.cvMainImage)
holder.itemView.setOnClickListener{
onItemClickCallback.onItemClicked(listMotors[holder.adapterPosition])
}
}
inner class CardViewMainViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
var cvMainImage: ImageView = itemView.findViewById(R.id.cardview_main_img)
var cvMainName: TextView = itemView.findViewById(R.id.cardview_main_txt)
}
interface OnItemClickCallback {
fun onItemClicked(data: Motor)
}
}
根据文档: 在 lateinit 属性 初始化之前访问它会抛出一个特殊的异常,该异常清楚地标识了正在访问的 属性 和事实上它还没有被初始化。
要检查一个lateinit变量是否已经被初始化, 在 属性:
的引用上使用 .isInitialized我不明白为什么它会导致这里出现问题。我认为你的代码没问题,但我可以为你解决问题。
对于您的情况,您可以通过两种方式解决您的问题。
1. 只需在点击侦听器中添加一个 if 条件来检查它是否被初始化。
holder.itemView.setOnClickListener{
//Check whether it is Initialized or not
if(::onItemClickCallback.isInitialized){
onItemClickCallback.onItemClicked(listMotors[holder.adapterPosition])
}
}
或
2. 删除 lateint 并使其可为空。
//Make it as nullable
private var onItemClickCallback : OnItemClickCallback? = null
holder.itemView.setOnClickListener {
holder.itemView.setOnClickListener {
// add ? for handling nullable
onItemClickCallback?.onItemClicked(listMotors[holder.adapterPosition])
}
}
我最终在适配器参数内而不是在函数中初始化了 onItemClickCallback。我以为我已经尝试过这种方式,但由于未知原因,它以前不起作用。感谢所有回复。 这是我的 activity
val recycleViewAdapter = CardViewMainAdapter(listMotor, object : CardViewMainAdapter.OnItemClickCallback{
override fun onItemClicked(data: Motor) {
val intent = Intent(this@MainActivity, DetailActivity::class.java)
intent.putExtra(DetailActivity.EXTRA_ID, data.id)
startActivity(intent)
}
})
rvMotor.adapter = recycleViewAdapter
这是我的适配器
class CardViewMainAdapter(private val listMotors: ArrayList<Motor>, private val onItemClickCallback: OnItemClickCallback) :
RecyclerView.Adapter<CardViewMainAdapter.CardViewMainViewHolder>() {