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

Android开发中RecyclerView展示待办列表时出现‘lateinit property binding has not been initialized’错误的解决求助

解决RecyclerView Adapter中的lateinit property binding has not been initialized崩溃问题

你踩了View Binding在RecyclerView Adapter里的常见坑——没有正确在ViewHolder中初始化item的Binding实例,反而在Adapter类里声明了一个从未赋值的lateinit变量,直接访问它当然会触发崩溃。我们一步步来修复:

1. 核心问题分析

你的Adapter类里声明了private lateinit var binding: ItemTodoBinding,但这个变量从始至终都没有被初始化过。同时你的TodoViewHolder只是单纯持有了itemView,没有关联对应的Binding对象,导致在onBindViewHolder里调用binding.txtTitle时,必然触发未初始化异常。

2. 修复Adapter代码

我们需要把Item的Binding实例放到ViewHolder里,并且在onCreateViewHolder中正确初始化它:

TodoAdapter(var todos: List<Todo>) : RecyclerView.Adapter<TodoAdapter.TodoViewHolder>() {
    // 让ViewHolder持有ItemTodoBinding实例,替代单纯的View
    inner class TodoViewHolder(val binding: ItemTodoBinding) : RecyclerView.ViewHolder(binding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TodoViewHolder {
        // 使用View Binding填充item布局,而非直接用LayoutInflater
        val binding = ItemTodoBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return TodoViewHolder(binding)
    }

    override fun onBindViewHolder(holder: TodoViewHolder, position: Int) {
        val currentTodo = todos[position]
        // 通过holder持有的binding访问item布局控件
        holder.binding.txtTitle.text = currentTodo.title
        holder.binding.cbTodo.isChecked = currentTodo.isChecked
    }

    override fun getItemCount(): Int {
        return todos.size
    }
}

3. 修复Activity中的初始化顺序问题

你的Activity代码里binding的初始化顺序有误,必须先调用super.onCreate(savedInstanceState),再初始化Binding,否则会触发生命周期异常:

class NextAftertoolbar : AppCompatActivity() {
    private lateinit var binding: ActivityNextAftertoolbarBinding // 先声明lateinit变量

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState) // 这行必须在Binding初始化之前执行
        binding = ActivityNextAftertoolbarBinding.inflate(layoutInflater)
        setContentView(binding.root)
        
        supportActionBar?.hide()
        val todolist = mutableListOf(
            Todo("Follow Android devs",false),
            Todo(" Learn ",false),
            Todo("Build",false),
            Todo("Land a role",false),
        )
        val adapter = TodoAdapter(todolist)
        binding.rvTodo.adapter = adapter
        binding.rvTodo.layoutManager=LinearLayoutManager(this)
        binding.btnTodo.setOnClickListener {
            val title = binding.etTodo.text.toString()
            val todo = Todo(title,false)
            todolist.add(todo)
            adapter.notifyItemInserted(todolist.size-1)
        }
    }
}

4. 额外优化提示

  • 如果需要支持待办事项的选中状态更新,记得给cbTodo设置点击监听器,更新数据源中的isChecked值后,调用adapter.notifyItemChanged(position)刷新对应item。
  • 建议把Adapter的todos参数改为MutableList,或者新增更新数据源的方法,后续修改数据会更灵活。

这样修改后,你的RecyclerView就能正常加载待办列表,不会再出现未初始化的崩溃了。

内容的提问来源于stack exchange,提问作者BlakOuz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:42:38