You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:18:45