问题通常发生在您删除正在LiveData对象中观察的项目(例如RecyclerView的一个项目)。这时候,您可能希望将LiveData对象的观察者删除而不是通过空指针异常触发处理:
val liveData = MutableLiveData>()
fun removeItem(item: MyItem) {
val items = liveData.value ?: return
items.remove(item)
liveData.value = items
}
fun addObserver(owner: LifecycleOwner, observer: Observer>) {
liveData.observe(owner, observer)
}
fun removeObserver(observer: Observer>) {
liveData.removeObserver(observer)
}
在这个示例中,removeObserver()
函数将LiveData对象的观察者从LiveData
对象中删除。如果您只需删除特定的观察者,则可以在addObserver()
函数中返回Observer
对象,并使用该对象调用removeObserver()
。
您还需要考虑到,在删除观察到的项目时,RecyclerView也需要更新。因为LiveData对象发出“null”,错误消息提示用户重新加载数据。这需要将LiveData观察者与RecyclerView视图绑定,以便每次从LiveData接收到项时,RecyclerView都能自动更新:
fun bindRecyclerView(recyclerView: RecyclerView, owner: LifecycleOwner) {
addObserver(owner, Observer { items ->
// update RecyclerView adapter
val adapter = recyclerView.adapter as MyAdapter
adapter.submitList(items)
})
}
在这个示例中,bindRecyclerView()
将LiveData观察者绑定到RecyclerView视图。这个函数将一个LifecycleOwner和RecyclerView作为参数,并将在每次LiveData中接收到新项目时更新RecyclerView。