Recyclerview具有LiveData onBackPressed的重复值片段

问题描述 投票:0回答:1

我有一个带有更多负载的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)
                }
            }
        }
    })
android kotlin mvvm viewmodel observers
1个回答
0
投票

我认为您没有正确观察result

例如,如果result的值为Status.LOADING,会发生什么?输入该块之后,可能还有其他情况您没有处理。我们不知道,因为没有其他whenelse 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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.