我有一个带有更多负载的recyclerview,并且我无法将值存储在数据库中。因此,当我加载数据时,一切都可以正常运行。当我导航到另一个片段,然后单击onBackPressed时,会发生问题,该观察者的onChanged再次被调用,它为我提供了从API调用的最后一个值。然后,如下面的代码所示,它们会自动添加到列表中并在UI中发布
productsViewModel.productsObject.observe(viewLifecycleOwner, Observer { result ->
if (result.status != Status.LOADING) {
(activity as MainActivity?)!!.dismissProgressDialog(getView())
if (result.status == Status.SUCCESS && result.data != null) {
val productsResult = parseObject(result.data.asJsonObject)
if (!productsResult.isNullOrEmpty()) {
products.addAll(productsResult)
productAdapter.submitList(products)
progressBar.visibility = View.GONE
numberSearch.text = products.size.toString() + "/" + total + " " + resources.getString(R.string.items_found)
} else if (result.status == Status.ERROR) {
if (result.message.isNullOrBlank())
Utils.showSnackBar(requireContext(), view, getString(R.string.something_wrong_try_again), true)
else
Utils.showSnackBar(requireContext(), view, result.message, true)
}
}
}
})
我认为您没有正确观察result
。
例如,如果result
的值为Status.LOADING
,会发生什么?输入该块之后,可能还有其他情况您没有处理。我们不知道,因为没有其他when
或else if
块。
另一种更“干净”的方式是:
productsViewModel.productsObject.observe(viewLifecycleOwner, Observer { result ->
when(result.status) {
Status.LOADING -> manageLoading()
Status.SUCCESS -> manageSuccess()
Status.ERROR -> manageError()
else -> manageBaseCase()
}
}
因此,它并非全部嵌入在唯一的if
块中,从而使管理更易于理解。
在您的Fragment中,您应该手动发送一个事件以“重置” LiveData的实际状态,以确保不会有重复的项目。
您的片段可能看起来像这样:
class ProductsFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.product_fragment, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
observe()
productsViewModel.send(Event.Load)
}
}