Android Kotlin新手:CardViewAdapter点击回调未初始化报错
解决lateinit property onItemClickCallback未初始化的问题
嘿,我来帮你搞定这个崩溃问题!你遇到的lateinit property onItemClickCallback has not been initialized错误,本质是因为你用lateinit声明的回调变量在被点击触发时还没被赋值。虽然你在MainActivity里调用了setOnItemClickCallback,但还是有风险触发这个异常,下面给你几个可靠的解决方案:
方案1:将lateinit改为可空类型(最稳妥的快速修复)
把回调变量改成可空的var,然后在点击时判空,这样即使没设置回调也不会崩溃,只是点击无反应:
修改CardViewMainAdapter.kt:
class CardViewMainAdapter(private val listMotors: ArrayList<Motor>) : RecyclerView.Adapter<CardViewMainAdapter.CardViewMainViewHolder>() { // 把lateinit改成可空变量 private var onItemClickCallback: OnItemClickCallback? = null fun setOnItemClickCallback(onItemClickCallback: OnItemClickCallback){ this.onItemClickCallback = onItemClickCallback } // ...其他代码不变 override fun onBindViewHolder(holder: CardViewMainViewHolder, position: Int) { // ...其他代码不变 holder.itemView.setOnClickListener{ // 用?.安全调用,避免空指针 onItemClickCallback?.onItemClicked(listMotors[holder.adapterPosition]) } } // ...其他代码不变 }
方案2:在构造函数中传入回调(从根源避免问题)
直接把回调作为adapter构造函数的参数,这样编译器会强制你在创建adapter时就传入回调,彻底杜绝未初始化的可能:
修改CardViewMainAdapter.kt的构造函数:
class CardViewMainAdapter( private val listMotors: ArrayList<Motor>, // 把回调加入构造参数 private val onItemClickCallback: OnItemClickCallback ) : RecyclerView.Adapter<CardViewMainAdapter.CardViewMainViewHolder>() { // 可以删掉setOnItemClickCallback方法了 // ...其他代码不变 override fun onBindViewHolder(holder: CardViewMainViewHolder, position: Int) { // ...其他代码不变 holder.itemView.setOnClickListener{ onItemClickCallback.onItemClicked(listMotors[holder.adapterPosition]) } } // ...其他代码不变 }
然后修改MainActivity.kt的adapter创建代码:
rvMotor.layoutManager = GridLayoutManager(this, 2) // 创建adapter时直接传入回调 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
额外检查点
确认你的MainActivity中设置回调和adapter的顺序是对的:先设置回调,再把adapter赋值给RecyclerView(你的代码顺序是对的,但如果后续修改代码时不小心调换顺序,也会触发这个错误)。
内容的提问来源于stack exchange,提问作者Adi Yulianto
相关产品推荐
相关产品推荐

