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

Android Todo应用EditText文本无法读取,RecyclerView/Room显示异常

问题:Todo应用EditText输入内容无法正确读取,RecyclerView和Room显示对象字符串

运行Todo应用时,EditText的输入文本无法被正确读取传递,RecyclerView与Room数据库中显示的是EditText对象的字符串(如android.widget.EditText{...})而非实际输入内容。

核心错误原因

在MainActivity的添加按钮点击事件中,获取EditText文本时错误调用了binding.etTodoTitle.toString(),这会返回EditText控件对象的字符串表示,而非输入框内的文本内容。正确的做法是调用binding.etTodoTitle.text.toString()来获取输入的文本。

修改后的关键代码片段

btnAddTodo.setOnClickListener {
    // 修正:获取EditText的文本内容
    val todoTitle = binding.etTodoTitle.text?.toString().orEmpty()

    if (todoTitle.isNotEmpty()) {
        val todo = Todo(null, todoTitle, false)

        GlobalScope.launch {
            todoDB.todoDao().insertAll(todo)
        }

        todoAdapter.addTodo(todo)
        binding.etTodoTitle.text.clear()
        Toast.makeText(this, "数据添加成功", Toast.LENGTH_LONG).show()
    } else {
        Toast.makeText(this, "输入内容不能为空", Toast.LENGTH_LONG).show()
    }
}

额外优化建议

  • 避免使用GlobalScope:GlobalScope属于全局作用域,容易引发内存泄漏,建议改用viewModelScope或lifecycleScope管理协程生命周期。
  • 数据同步:当前添加Todo时直接更新Adapter列表,但Room数据库插入是异步操作,建议从Room查询数据后更新Adapter,保证列表与数据库数据一致。
  • 空值安全处理:使用binding.etTodoTitle.text?.toString().orEmpty()避免空指针异常。

完整修改后的MainActivity代码

package com.example.todoit

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.todoit.data.Todo
import com.example.todoit.data.TodoDataBase
import com.example.todoit.databinding.ActivityMainBinding
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {

    private lateinit var todoAdapter: TodoAdapter
    private lateinit var todoDB: TodoDataBase
    private lateinit var binding: ActivityMainBinding


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        todoDB = TodoDataBase.getInstance(this)
        todoAdapter = TodoAdapter(mutableListOf())

        val rvTodoItems = binding.rvTodoItems
        val btnAddTodo = binding.btnAddTodo
        val btnDeleteTodo = binding.btnDeleteTodo

        rvTodoItems.layoutManager = LinearLayoutManager(this)
        rvTodoItems.adapter = todoAdapter

        btnAddTodo.setOnClickListener {
            val todoTitle = binding.etTodoTitle.text?.toString().orEmpty()

            if (todoTitle.isNotEmpty()) {
                val todo = Todo(null, todoTitle, false)

                GlobalScope.launch {
                    todoDB.todoDao().insertAll(todo)
                }

                todoAdapter.addTodo(todo)
                binding.etTodoTitle.text.clear()
                Toast.makeText(this, "数据添加成功", Toast.LENGTH_LONG).show()
            } else {
                Toast.makeText(this, "输入内容不能为空", Toast.LENGTH_LONG).show()
            }
        }

        btnDeleteTodo.setOnClickListener {
            todoAdapter.deleteDoneTodos()
            Toast.makeText(this, "已选中的待办已删除", Toast.LENGTH_LONG).show()
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:06:51