解决Kotlin RecyclerView类型参数越界:需为ViewHolder子类型报错
报错原因
RecyclerView.Adapter的泛型参数有明确约束:传入的ViewHolder类型必须是RecyclerView.ViewHolder的子类。你的代码中StudentViewHolder错误继承了RecyclerView类,而非RecyclerView.ViewHolder,完全不符合泛型边界要求,因此触发编译报错。
另外代码中stdList使用了无泛型声明的原始类型ArrayList,属于不规范写法,虽然不会直接触发本次报错,但会带来类型安全隐患。
修复步骤
- 修正
StudentViewHolder的继承关系,将父类从RecyclerView改为RecyclerView.ViewHolder,构造参数保持传入itemView即可。 - 补全
stdList的泛型声明,明确其存储元素类型为StudentModel,消除原始类型风险。
修复后完整代码
import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button import android.widget.TextView import androidx.recyclerview.widget.RecyclerView class StudentAdapter: RecyclerView.Adapter<StudentAdapter.StudentViewHolder>() { private var stdList: ArrayList<StudentModel> = ArrayList() fun addItems(items: ArrayList<StudentModel>){ this.stdList = items } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StudentViewHolder { return StudentViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.card_items_std, parent,false) ) } override fun onBindViewHolder(holder: StudentViewHolder, position: Int) { val std = stdList[position] holder.bindView(std) } override fun getItemCount(): Int = stdList.size class StudentViewHolder(var view: View): RecyclerView.ViewHolder(view){ private val id = view.findViewById<TextView>(R.id.tvId) private val name = view.findViewById<TextView>(R.id.tvName) private val email = view.findViewById<TextView>(R.id.tvEmail) private val btnDelete = view.findViewById<Button>(R.id.btnDelete) fun bindView(std: StudentModel){ id.text = std.id.toString() name.text= std.name.toString() email.text = std.email.toString() } } }
补充:如果需要数据更新后立刻刷新列表,可在
addItems方法末尾添加notifyDataSetChanged()调用。
内容的提问来源于stack exchange,提问作者Bdbf Kazinga
相关产品推荐
相关产品推荐

