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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:20:28