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

Kotlin中从Adapter启动Activity报错:预期Context却传入Intent

解决Kotlin Adapter中启动Activity时的Type Mismatch错误

嘿,这个问题我之前写RecyclerView Adapter的时候也踩过坑,咱们先拆解下错误原因:"Type Mismatch: inferred type is Intent but context was expected" 意思是你在某个需要传入Context的地方,不小心传了Intent对象,大概率是启动Activity的代码写法出了问题,或是同时调用其他需要Context的方法时参数搞错了。

下面是具体的排查和解决步骤:

1. 确保Adapter持有有效的Context

首先,你的Adapter需要持有一个可用的Context(一般从对应的Activity/Fragment传入),比如在构造函数里声明:

class MyItemAdapter(
    private val context: Context,
    private val itemList: List<Item>
) : RecyclerView.Adapter<MyItemAdapter.ItemViewHolder>() {
    // ... 其他Adapter相关代码
}

2. 正确启动Activity的写法

在ViewHolder的点击事件里,要通过持有的Context来调用startActivity(),并传入正确构建的Intent。示例代码如下:

inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    init {
        itemView.setOnClickListener {
            val position = adapterPosition
            val currentItem = itemList[position]
            
            // 1. 构建目标Activity的Intent
            val intent = Intent(context, TargetDetailActivity::class.java)
            // 可选:传递数据到目标Activity
            intent.putExtra("ITEM_ID", currentItem.id)
            
            // 2. 通过context启动Activity(关键!)
            context.startActivity(intent)
        }
    }
}

3. 排查常见的错误场景

除了启动Activity的写法,还有一种容易踩的坑:在同一代码块里调用其他需要Context的方法(比如Toast)时,误把Intent当成Context传入,比如:

// 错误示例:Toast的第一个参数需要Context,却传了Intent
val intent = Intent(context, TargetDetailActivity::class.java)
Toast.makeText(intent, "即将跳转", Toast.LENGTH_SHORT).show() // 这里会触发Type Mismatch错误

把上面的代码改成Toast.makeText(context, "即将跳转", Toast.LENGTH_SHORT).show()就可以解决。

额外提示

如果你的Adapter是在Fragment中使用,建议传入requireContext()而不是Fragment的context属性,避免空指针风险;如果是在Activity中,直接传this即可。

内容的提问来源于stack exchange,提问作者mili2501

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:04:57