首页 > 解决方案 > 我想在将其设置为 RecyclerView 适配器之前更新项目列表。列表来自服务器(Android、Kotlin)[已关闭]

问题描述

我正在做一个项目。场景是我从服务器接收项目列表。在将其设置为 recycler-view 适配器之前,我正在检查项目是否被用户删除,如果项目被删除,则 itemId、deletedItemsCount、customerId 等已删除项目的数据将存储在本地数据库中。然后从数据库中获取特定产品的已删除项目并将其从从服务器接收的总项目中减去,然后更新列表中的特定项目,然后将其设置为适配器。

理解场景的简单方法是(步骤)

问题是当用户通过单击已删除图标删除项目时,它会更新列表中的所有产品项目。它应该更新用户单击删除图标的特定产品的项目。

随附的屏幕截图和代码片段供您参考。任何类型的建议都会有所帮助。谢谢你。

mainLocalViewModel.getAllDeletedItems().observe(viewLifecycleOwner, Observer {

        viewModel.customerOrdersList.clear()

        for (items in viewModel.serverCustomerOrderList) {
            viewModel.customerOrdersList.add(items as OrderItemModel)
        }

        if (it != null && it.isNotEmpty()) {

            for (itemsInDb in it) {

                for ((index, itemsInServer) in viewModel.customerOrdersList.withIndex()) {

                    if (itemsInDb.itemId == itemsInServer.itemId && itemsInDb.customerId == viewModel.customerId) {

                        val totalInServer = itemsInServer.itemTotal
                        val totalInDb = itemsInDb.deletedItems

                        val remainingTotalItems = totalInDb?.let { it1 ->
                            totalInServer?.minus(
                                it1
                            )
                        }

                        viewModel.customerOrdersList[index].itemTotal = remainingTotalItems

                        if (::customerOrdersAdapter.isInitialized) {
                            customerOrdersAdapter.notifyItemChanged(index)
                        }

                    }

                }

            }

            if (!::customerOrdersAdapter.isInitialized) {

                customerOrdersAdapter =
                    CustomerOrdersAdapter(
                        requireContext(),
                        viewModel.customerOrdersList,
                        this
                    )

                binding.apply {
                    recyclerViewCustomerOrder.apply {
                        layoutManager = GridLayoutManager(requireContext(), 2)
                        adapter = customerOrdersAdapter
                    }
                }

            }


        }

数据库结构截图

从服务器接收列表的屏幕截图

用户删除对话框的屏幕截图

标签: androidlistapikotlinandroid-recyclerview

解决方案


您可能想在本教程中查看 DiffUtil:https ://www.raywenderlich.com/21954410-speed-up-your-android-recyclerview-using-diffutil

它基本上是一个比较列表中每两项并计算新旧数据列表之间差异的类,这样如果您只删除一个项目,它应该只从列表中更新该项目。


推荐阅读