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

Kotlin RecyclerView中ItemView类型不匹配与类型转换异常求助

Kotlin RecyclerView布局绑定问题

问题描述

  • 找不到独立的ItemView类型,只能使用MenuView.ItemView,但Glide报错:Type mismatch: inferred type is MenuView.ItemView but ImageView was expected
  • 将类型改为ImageView后,抛出ClassCastException:androidx.constraintlayout.widget.ConstraintLayout cannot be cast to android.widget.ImageView

相关代码

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var tvName: TextView = itemView.findViewById(R.id.tvName)
    var tvAge: TextView = itemView.findViewById(R.id.tvAge)
    var ivProfile: ItemView = itemView.findViewById(R.id.ivProfile)

    fun bind(contact: Contact) {
        tvName.text = contact.name
        tvAge.text = "Age: ${contact.age}"

        Glide.with(context).load(contact.imageUrl).into (ivProfile)
    }
}

错误日志

类型不匹配错误

Type mismatch: inferred type is MenuView.ItemView but ImageView was expected.

类型转换异常

java.lang.ClassCastException: androidx.constraintlayout.widget.ConstraintLayout cannot be cast to android.widget.ImageView
                                    at com.jakob.kotlinrecyclerview.ContactAdapter$ViewHolder.<init>(ContactAdapter.kt:35)
                                    at com.jakob.kotlinrecyclerview.ContactAdapter.onCreateViewHolder(ContactAdapter.kt:17)
                                    at com.jakob.kotlinrecyclerview.ContactAdapter.onCreateViewHolder(ContactAdapter.kt:13)

解决方案

1. 纠正控件类型声明

你混淆了RecyclerView列表项的根布局itemView和MenuView.ItemView类。ivProfile是列表项布局中的ImageView控件,直接声明为ImageView即可,不需要用MenuView.ItemView。

2. 修复类型转换异常

出现ClassCastException是因为findViewById(R.id.ivProfile)获取到的是ConstraintLayout而非ImageView,按以下步骤排查:

  • 检查列表项的布局XML文件,确认R.id.ivProfile对应的控件确实是ImageView,而非它的父布局ConstraintLayout
  • 若ID无误,执行Clean Project后再Rebuild Project清除布局缓存

修正后的代码

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var tvName: TextView = itemView.findViewById(R.id.tvName)
    var tvAge: TextView = itemView.findViewById(R.id.tvAge)
    var ivProfile: ImageView = itemView.findViewById(R.id.ivProfile)

    fun bind(contact: Contact) {
        tvName.text = contact.name
        tvAge.text = "Age: ${contact.age}"

        Glide.with(itemView.context).load(contact.imageUrl).into(ivProfile)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:15:40