【发布时间】:2021-01-21 08:32:47
【问题描述】:
我有一个显示项目列表的片段,从视图模型观察(从 http 服务,它们没有保存在数据库中)。现在,我需要删除其中一项。我有一个删除结果实时数据,因此视图可以观察项目何时被删除。
片段
fun onViewCreated(view: View, savedInstanceState: Bundle?) {
//...
viewModel.deleteItemLiveData.observe(viewLifecycleOwner) {
when (it.status) {
Result.Status.ERROR -> showDeletingError()
Result.Status.SUCCESS -> {
itemsAdapter.remove(it.value)
commentsAdapter.notifyItemRemoved(it.value)
}
}
}
}
fun deleteItem(itemId: String, itemIndex: Int) = lifecycleScope.launch {
viewModel.deleteItem(itemId, itemIndex)
}
视图模型
val deleteItemLiveData = MutableLiveData<Result<Int>>()
suspend fun deleteItem(itemId: String, itemIndex: Int) = withContext(Dispatchers.IO) {
val result = service.deleteItem(itemId)
withContext(Dispatchers.Main) {
if (result.success) {
deleteItemLiveData.value = Result.success(itemIndex)
} else {
deleteItemLiveData.value = Result.error()
}
}
}
它工作正常,但是当我导航到另一个片段并再次返回时出现问题。 deleteItemLIveData 与最后一个 Result 再次发出,因此 Fragment 尝试再次从适配器中删除该项目,它崩溃了。
我该如何解决这个问题?
【问题讨论】:
-
为什么片段在加载时会检索到陈旧的项目列表?为什么它没有得到更新的列表?
-
我能做到。但在那种情况下,我会遇到同样的问题。如何查看删除结果,例如显示错误消息而不在每次恢复时重新显示?
-
这是一个架构问题,您正在尝试从适配器中删除已删除的项目,而不是收听对删除做出反应的更新的项目列表。
-
我理解你。但想象一下,我侦听更新的列表,而不是从适配器中删除该项目。在那种情况下,我坚持,如何查看观察删除结果,以防万一失败,在屏幕上显示错误?
-
我添加了一个答案,解释了我将如何处理这个问题。关于错误,不应将其与存储库中的数据相结合,在删除时向用户显示就足够了。
标签: android android-fragments android-lifecycle android-livedata