【问题标题】:lateinit property viewModel not initialized when calling a method on click from RecyclerView Adapter从 RecyclerView 适配器调用单击方法时,lateinit 属性 viewModel 未初始化
【发布时间】:2020-02-05 18:27:38
【问题描述】:

我正在尝试通过在用户长按时调用方法从房间数据库中删除笔记 注意,我在 RView 适配器上设置了 onLongClickListener:

viewHolder.itemView.setOnCLickListener{
            NotesFragment().deleteSingleNote(notesID)
        }

在 NotesFragment 上,方法如下:

fun deleteSingleNote(notesID: Long) {
        notesFragmentViewModel.deleteSingleNoteFromDB(notesID)
    }

在 ViewModel 上,该方法通过协程删除注释。

应用长点击崩溃,说lateinit notesFragmentViewModel没有初始化,指向onLongCLickListener这一行,还有我上面粘贴的NotesFragment那一行。

问题是,笔记是通过一个包含所有笔记的 NotesFragmentViewModel LiveData 变量填充到屏幕上的,所以当我长按该项目时,ViewModel 已经非常初始化了。

我尝试在适配器上初始化 ViewModel,但出现了一个与 ViewModel 相关的异常,该异常不允许在片段/活动以外的其他对象上实例化。

这是我在 SOverflow 上的第一篇文章,如果我做错了什么请告诉我

【问题讨论】:

  • lateinit property viewModel not initialized 这意味着您的 viewModel 没有被初始化,永远不会被分配一个值,基本上是一个不应该为 null 的东西上的 null,看看你在哪里为 viewModel 分配了一个值,你会有你的答案
  • 是的,我知道,我不知道为什么它说它没有初始化,因为我长时间点击的项目是使用来自同一个 ViewModel 的变量填充的

标签: android kotlin android-recyclerview viewmodel


【解决方案1】:

OnClickListener 中,您要访问当前显示的NotesFragment 实例。但是使用NotesFragment() 可以创建NotesFragment 的新实例。由于它不会附加到任何 Activity,因此很可能新实例的 notesFragmentViewModel 属性尚未初始化。

所以要避免Exception 您必须访问NotesFragment 的正确实例。您可以将NotesFragment 类型的参数引入RecyclerView.Adapter 的构造函数,但这被认为是不好的做法。

最好让适配器类有一个接口(我们称之为ListItemClickedListener)和一个需要ListItemClickedListener 实例作为参数的构造函数。

interface ListItemClickedListener{
    fun singleNoteLongClicked(notesID: Long)
}

然后您可以让NotesFragment 实现ListItemClickedListener 并将其自身传递给适配器,或者您使用ListItemClickedListener 的匿名本地实例。

适配器内部:

viewHolder.itemView.setOnCLickListener{
    listItemClickListener.singleNoteLongClicked(notesID)
}

NotesFragment:

override fun singleNoteLongClicked(notesID: Long){
    this@NotesFragment.deleteSingleNote(notesID)
} 

请参阅 this post 以了解此模式的实现。

【讨论】:

  • 我会使用 ListItemClickListener 作为适配器的长点击监听器吗?或者更确切地说,我将使用这个 ListItemClickListener 做什么?
  • @Sir - 我将编辑我的答案并添加一些代码 sn-ps
猜你喜欢
  • 2020-06-08
  • 2021-06-11
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多