Android Studio Kotlin开发:XML ID未解析引用错误求助
解决TodoAdapter中未解析tvTodoTitle和cbDone引用的问题
问题原因
你在onBindViewHolder里直接访问tvTodoTitle和cbDone,但当前代码的TodoViewHolder仅简单继承父类,未对item布局内的控件做绑定处理,导致Kotlin无法识别这些ID对应的视图。此外代码里还有一处拼写错误:curtodo.isChecked应改为curTodo.isChecked(首字母大写)。
解决方案一:使用View Binding(推荐)
View Binding是Android官方推荐的视图绑定方案,自动生成绑定类,无需手动编写findViewById代码。
1. 开启View Binding
在模块级build.gradle.kts(或build.gradle)中添加配置:
android { ... buildFeatures { viewBinding true } }
添加后点击Sync Now同步项目。
2. 修改TodoAdapter代码
利用自动生成的ItemTodoBinding类完成视图绑定:
package com.mohan.project import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.mohan.project.databinding.ItemTodoBinding class TodoAdapter(private val todos: MutableList<Todo>) : RecyclerView.Adapter<TodoAdapter.TodoViewHolder>() { 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 getItemCount(): Int = todos.size override fun onBindViewHolder(holder: TodoViewHolder, position: Int) { val curTodo = todos[position] holder.binding.tvTodoTitle.text = curTodo.title holder.binding.cbDone.isChecked = curTodo.isChecked } }
解决方案二:手动使用findViewById
若暂时不想启用View Binding,可在ViewHolder中手动查找控件:
package com.mohan.project import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.CheckBox import android.widget.TextView import androidx.recyclerview.widget.RecyclerView class TodoAdapter(private val todos: MutableList<Todo>) : RecyclerView.Adapter<TodoAdapter.TodoViewHolder>() { class TodoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val tvTodoTitle: TextView = itemView.findViewById(R.id.tvTodoTitle) val cbDone: CheckBox = itemView.findViewById(R.id.cbDone) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TodoViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_todo, parent, false) return TodoViewHolder(view) } override fun getItemCount(): Int = todos.size override fun onBindViewHolder(holder: TodoViewHolder, position: Int) { val curTodo = todos[position] holder.tvTodoTitle.text = curTodo.title holder.cbDone.isChecked = curTodo.isChecked } }
额外检查
确保你的项目中存在Todo数据类,且包含对应的属性:
data class Todo(val title: String, val isChecked: Boolean)
内容的提问来源于stack exchange,提问作者Mohan Sai0007
相关产品推荐
相关产品推荐

