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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:35:45