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

