点击SaveTask按钮后任务未在MainActivity显示且应用崩溃,是否布局管理器设置异常?
问题原因及修复方案
1. 应用崩溃原因及修复
你在MainActivity中初始化RecyclerView时,仅对自定义的layoutmanger变量赋值,并未将布局管理器设置给RecyclerView组件本身,导致RecyclerView缺少必要配置触发空指针异常崩溃。
修复代码:
修改MainActivity.kt中onCreate里的RecyclerView初始化逻辑:
todoRv.apply { // 直接给RecyclerView的原生layoutManager属性赋值 layoutManager = LinearLayoutManager(this@MainActivity) adapter = this@MainActivity.recyclerAdapter }
你自定义的lateinit var layoutmanger: RecyclerView.LayoutManager变量全程没有被用到,可直接删除。
2. 新增任务不显示原因及修复
你在TodoDao.kt中定义的查询逻辑为where isFinished != -1,但新增TodoModel时isFinished的默认值就是-1,导致刚插入的任务不符合查询条件,LiveData无法感知到新增数据,列表不会刷新。
修复方案二选一即可:
方案1:修改新增任务的isFinished默认值
修改TaskActivity.kt中saveTask方法里创建TodoModel的代码,给isFinished赋值为非-1的数值:
return@withContext db.todoDao().insertTask( TodoModel( taskName, isFinished = 0 ) )
方案2:修改查询逻辑
修改TodoDao.kt中的查询语句,移除isFinished的限制:
@Query("Select * From TodoModel") fun getAllTask():LiveData<List<TodoModel>>
可选优化
你当前MainActivity中LiveData的监听逻辑仅在数据非空时更新列表,若后续清空所有任务,列表不会同步更新为空,可调整为:
db.todoDao().getAllTask().observe(this, Observer { todoList.clear() it?.let { todoList.addAll(it) } recyclerAdapter.notifyDataSetChanged() })
内容的提问来源于stack exchange,提问作者Pankaj
相关产品推荐
相关产品推荐

