Android onBindViewHolder无法识别XML控件问题咨询
问题分析与解决
1. 无法识别XML控件的核心原因
你当前的代码里,holder.itemView是普通的View对象,Kotlin无法直接识别布局里的tvTodoTitle控件——这不是教程过时,而是代码缺少必要的控件实例获取逻辑,要么没启用视图绑定(View Binding),要么没手动通过findViewById获取控件。
2. 推荐解决方案:启用视图绑定
步骤1:在模块级build.gradle中开启视图绑定
打开app模块下的build.gradle.kts(或build.gradle),添加配置后同步Gradle:
android { buildFeatures { viewBinding = true } }
同步后系统会自动为item_todo.xml生成对应的绑定类ItemTodoBinding。
步骤2:修改TodoAdapter代码
package com.example.todo import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.example.todo.databinding.ItemTodoBinding class TodoAdapter( private val todos: MutableList<Todo> ) : RecyclerView.Adapter<TodoAdapter.TodoViewHolder>() { // 使用视图绑定类替代普通View class TodoViewHolder(val binding: ItemTodoBinding) : RecyclerView.ViewHolder(binding.root) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TodoViewHolder { val binding = ItemTodoBinding.inflate(LayoutInflater.from(parent.context), parent, false) return TodoViewHolder(binding) } override fun onBindViewHolder(holder: TodoViewHolder, position: Int) { val curTodo = todos[position] // 通过绑定类直接访问控件 holder.binding.tvTodoTitle.text = curTodo.title // 可同时设置CheckBox状态(如果Todo类有isDone字段) holder.binding.cbDone.isChecked = curTodo.isDone } override fun getItemCount(): Int { // 修正拼写错误:todo -> todos return todos.size } }
3. 备选方案:手动用findViewById(适配旧写法)
如果不想用视图绑定,可在ViewHolder中手动获取控件:
class TodoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val tvTodoTitle: TextView = itemView.findViewById(R.id.tvTodoTitle) val cbDone: CheckBox = itemView.findViewById(R.id.cbDone) } // 在onBindViewHolder中使用 override fun onBindViewHolder(holder: TodoViewHolder, position: Int) { val curTodo = todos[position] holder.tvTodoTitle.text = curTodo.title }
4. 额外代码错误修正
你当前getItemCount()方法里的return todo.size存在拼写错误,应改为todos.size(与构造方法的参数名一致),否则会报未定义变量的错误。
内容的提问来源于stack exchange,提问作者MS_Warrior
相关产品推荐
相关产品推荐

