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
相关产品推荐
相关产品推荐

