lateinit 属性 从 RecyclerView Adapter 单击调用方法时,viewModel 未初始化
lateinit property viewModel not initialized when calling a method on click from RecyclerView Adapter
我正在尝试通过在用户长按时调用方法来从房间数据库中删除注释
在笔记上,我在 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,但出现与不允许在 fragment/activity 以外的其他对象上实例化 ViewModel 相关的异常。
这是我第一次 post 在 SOverflow 上,所以如果我做错了什么请告诉我
在 OnClickListener
中,您想访问当前显示的 NotesFragment
实例。但是使用 NotesFragment()
你创建了一个新的 NotesFragment
实例。由于它不会附加到任何 Activity
,因此很可能新实例的 notesFragmentViewModel 属性 尚未初始化。
因此,为了避免 Exception
,您必须访问 NotesFragment
的正确实例。您可以将 NotesFragment
类型的参数引入 RecyclerView.Adapter
的构造函数,但这被认为是不好的做法。
最好让适配器 class 有一个接口(我们称它为 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)
}
例如,请参阅 以了解此模式的实现。
我正在尝试通过在用户长按时调用方法来从房间数据库中删除注释 在笔记上,我在 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,但出现与不允许在 fragment/activity 以外的其他对象上实例化 ViewModel 相关的异常。
这是我第一次 post 在 SOverflow 上,所以如果我做错了什么请告诉我
在 OnClickListener
中,您想访问当前显示的 NotesFragment
实例。但是使用 NotesFragment()
你创建了一个新的 NotesFragment
实例。由于它不会附加到任何 Activity
,因此很可能新实例的 notesFragmentViewModel 属性 尚未初始化。
因此,为了避免 Exception
,您必须访问 NotesFragment
的正确实例。您可以将 NotesFragment
类型的参数引入 RecyclerView.Adapter
的构造函数,但这被认为是不好的做法。
最好让适配器 class 有一个接口(我们称它为 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)
}
例如,请参阅