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
相关产品推荐
相关产品推荐

