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

Android RecyclerView适配器类型不匹配问题求助

解决RecyclerView适配器类型不匹配问题:Type mismatch错误

你的代码报错Type mismatch: inferred type is ListDemonAdapter but RecyclerView.Adapter<(raw) RecyclerView.ViewHolder!>? was expected,核心原因是**ListDemonAdapter没有正确继承RecyclerView.Adapter类,也未实现该类要求的抽象方法**。RecyclerView的适配器必须遵循它的规范才能被RecyclerView识别并关联。

修正步骤:修改ListDemonAdapter代码

需要让适配器继承RecyclerView.Adapter,并实现三个强制要求的抽象方法:onCreateViewHolder、onBindViewHolder、getItemCount。

修改后的完整ListDemonAdapter代码如下:

package com.example.dicoding

import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView

// 1. 继承RecyclerView.Adapter,并指定泛型为自定义的ListViewHolder
class ListDemonAdapter(private val listdemon: ArrayList<demonlisr>) : RecyclerView.Adapter<ListDemonAdapter.ListViewHolder>() {
    private lateinit var onItemClickCallback: OnItemClickCallback

    fun setOnItemClickCallback(onItemClickCallback: OnItemClickCallback) {
        this.onItemClickCallback = onItemClickCallback
    }

    class ListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val imgPhoto: ImageView = itemView.findViewById(R.id.img_detail_photo)
        val tvName: TextView = itemView.findViewById(R.id.tv_detail_name)
        val tvDescription: TextView = itemView.findViewById(R.id.tv_detail_description)
    }

    // 2. 实现onCreateViewHolder:加载item布局并创建ViewHolder实例
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_demon, parent, false)
        // 注意:这里的R.layout.item_demon需要替换成你实际的item布局ID
        return ListViewHolder(view)
    }

    // 3. 实现onBindViewHolder:绑定数据到ViewHolder的视图(添加override关键字)
    override fun onBindViewHolder(holder: ListViewHolder, position: Int) {
        val (name, description, photo) = listdemon[position]
        holder.imgPhoto.setImageResource(photo)
        holder.tvName.text = name
        holder.tvDescription.text = description

        holder.itemView.setOnClickListener {
            val intentDetail = Intent(holder.itemView.context, description::class.java)
            intentDetail.putExtra("key_demon", listdemon[holder.adapterPosition])
            holder.itemView.context.startActivity(intentDetail)
            // 移除重复的startActivity调用
            // context.startActivity(intentDetail)
        }
    }

    // 4. 实现getItemCount:返回列表的总数量
    override fun getItemCount(): Int {
        return listdemon.size
    }

    interface OnItemClickCallback {
        fun onItemClicked(data: demonlisr)
    }
}

关键说明:

  • 继承关系:适配器必须继承RecyclerView.Adapter<ViewHolder>,泛型指定为你自定义的ViewHolder类,这样RecyclerView才能识别它的类型。
  • onCreateViewHolder:必须实现这个方法来加载你的item布局文件(注意替换成你项目中实际的item布局ID,比如R.layout.item_demon)。
  • getItemCount:返回数据源的长度,RecyclerView靠这个方法知道列表有多少项。
  • 原代码中的onBindViewHolder需要添加override关键字,因为它是重写父类的方法。

额外建议:

  • 类名规范:Kotlin中类名应该首字母大写,比如demonlisr建议改成DemonList,description如果是Activity类也应该改成DescriptionActivity,避免和变量名混淆。
  • 移除重复代码:原onBindViewHolder中重复调用了startActivity,删掉其中一个即可。

修改完成后,rvDemon.adapter = listDemonAdapter这行代码的类型不匹配问题就会解决。

内容的提问来源于stack exchange,提问作者Amura Maulidi Fachry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:40:26