AlertDialog не обновляет список — Kotlin Android

Я пытаюсь быть младшим разработчиком Android и пытаюсь сделать фальшивый список продуктов из API. Я использую recyclerview с gridlayout. Я создал асинхронный список в своем адаптере и собирал значения из модели представления, наблюдая и отправляя фрагмент. И я бы добавил параметры сортировки и фильтрации в свой фрагмент. Я бы сделал это как настоящие приложения. Я создал 2 диалога предупреждений для своих кнопок. Я могу сортировать и фильтровать соответственно. Но сортировка после фильтра не работает во второй раз. Впервые я могу фильтровать и сортировать. Но если я изменил фильтр, я не могу сортировать элементы. Список приходит пустым из диалогового окна фильтра предупреждений...

Вот мой кодовый блок;

      @AndroidEntryPoint

класс ProductFragment: Фрагмент (R.layout.fragment_product) {

      private var fragmentBinding : FragmentProductBinding? = null

@Inject
lateinit var viewModel: HomeViewModel
@Inject
lateinit var adapter: ProductsAdapter

lateinit var list : MutableList<Product>

private var filteredList = mutableListOf<Product>()


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val binding = FragmentProductBinding.bind(view)
    fragmentBinding = binding

    viewModel.getAllProducts()

    viewModel.products.observe(viewLifecycleOwner){
        adapter.recyclerListDiffer.submitList(it.data)
        list = adapter.recyclerListDiffer.currentList
    }
    filteredList.addAll(adapter.recyclerListDiffer.currentList)

    binding.productsRecycler.adapter = adapter
    binding.productsRecycler.layoutManager = StaggeredGridLayoutManager(2,RecyclerView.VERTICAL)

    adapter.setOnItemClickListener {
        val action = ProductFragmentDirections.actionProductFragmentToDetailScreenFragment(it)
        findNavController().navigate(action)
    }

    //**BACK BUTTON
    binding.productsBackbutton.setOnClickListener {
        findNavController().popBackStack()
    }

    //** SORT    ***///

    val sortArray = arrayOf("Best Match","Price Asc","Price Desc")
    var adbIndex = 0
    var selectedItem = ""
    binding.productsSortbutton.setOnClickListener {
        MaterialAlertDialogBuilder(requireContext())
            .setSingleChoiceItems(sortArray,adbIndex){ dialog,which->
                adbIndex = which
                selectedItem = sortArray[which]

            }
            .setPositiveButton("Sort"){dialog,which->

                when(selectedItem){
                    sortArray.get(0) ->{
                            adapter.recyclerListDiffer.submitList(filteredList)
                        }
                        else {
                            adapter.recyclerListDiffer.submitList(list)
                        }
                        binding.productsRecycler.smoothScrollToPosition(0)
                    }
                    sortArray.get(1) ->{
                        if (filteredList.isNotEmpty()){
                            adapter.recyclerListDiffer.submitList(filteredList.sortedBy { it.price.toDouble() })
                        }
                        else {
                            adapter.recyclerListDiffer.submitList(list.sortedBy { it.price.toDouble() })
                        }
                        binding.productsRecycler.smoothScrollToPosition(0)
                    }
                    sortArray.get(2) -> {
                        if (filteredList.isNotEmpty()){
                            adapter.recyclerListDiffer.submitList(filteredList.sortedByDescending { it.price.toDouble() })
                        }
                        else{
                            adapter.recyclerListDiffer.submitList(list.sortedByDescending { it.price.toDouble() })
                        }
                        binding.productsRecycler.smoothScrollToPosition(0)

                    }
                }

            }
            .show()
    }


    //FILTER
    val filterArray = arrayOf("Electronics","Jewelery","Men's Clothing","Women's Clothing")
    var filterArrayBool : BooleanArray = booleanArrayOf(false,false,false,false)
    val currentItemList = Arrays.asList(*filterArray)
    val selectedItemList = ArrayList<String>()


    binding.productsFilterbutton.setOnClickListener {


         MaterialAlertDialogBuilder(requireContext())
             .setCancelable(false)
            .setMultiChoiceItems(filterArray,filterArrayBool) {dialog,which,isChecked ->
                filterArrayBool[which] = isChecked
            }
            .setPositiveButton("FILTER"){dialog,which->
                for (i in filterArrayBool.indices){
                    val checked = filterArrayBool[i]
                    if (checked){
                        selectedItemList.add(currentItemList[i].lowercase())
                    }
                    when(selectedItemList.size){
                        1 -> {
                            filteredList.clear()
                            viewModel.products.observe(viewLifecycleOwner){
                                adapter.recyclerListDiffer.submitList(it.data?.filter { it.category== selectedItemList.get(0) })
                            }
                            filteredList.addAll(adapter.recyclerListDiffer.currentList.filter { it.category == selectedItemList.get(0) })

                        }
                        2 -> {
                            viewModel.products.observe(viewLifecycleOwner){
                                adapter.recyclerListDiffer.submitList(it.data?.filter { it.category== selectedItemList.get(0) || it.category == selectedItemList.get(1) })
                                filteredList.clear().also { filteredList.addAll(adapter.recyclerListDiffer.currentList.filter { it.category== selectedItemList.get(0) || it.category == selectedItemList.get(1) }) }
                            }
                        }

                        3 -> {
                            viewModel.products.observe(viewLifecycleOwner){
                                adapter.recyclerListDiffer.submitList(it.data?.filter { it.category== selectedItemList.get(0) || it.category == selectedItemList.get(1) || it.category == selectedItemList.get(2)  })
                                filteredList.clear().also { filteredList.addAll(adapter.recyclerListDiffer.currentList.filter { it.category== selectedItemList.get(0) || it.category == selectedItemList.get(2) }) }
                            }
                        }

                        4 -> {
                            viewModel.products.observe(viewLifecycleOwner){
                                adapter.recyclerListDiffer.submitList(it.data?.filter { it.category== selectedItemList.get(0) || it.category == selectedItemList.get(2) || it.category == selectedItemList.get(3) })
                                filteredList.clear().also { filteredList.addAll(adapter.recyclerListDiffer.currentList.filter { it.category== selectedItemList.get(0) || it.category == selectedItemList.get(2) || it.category == selectedItemList.get(3) }) }
                            }
                        } else ->
                        viewModel.products.observe(viewLifecycleOwner){
                            adapter.recyclerListDiffer.submitList(it.data)
                            filteredList.clear().also { filteredList.addAll(adapter.recyclerListDiffer.currentList) }
                        }
                    }

                }

                binding.productsRecycler.smoothScrollToPosition(0)
                selectedItemList.clear()

            } .setNeutralButton("Show All"){dialog,which ->
                viewModel.products.observe(viewLifecycleOwner){
                    adapter.recyclerListDiffer.submitList(it.data) }
                filterArrayBool.forEach { it==false }
                binding.productsRecycler.smoothScrollToPosition(0)

            }.show()
        }

    }

}

Как я могу обновлять список каждый раз, когда я нажимаю положительную кнопку?

1 ответ

После многих часов я чувствую себя глупо. Проблема в том, что при попытке вызвать список из текущего списка. Отправляя список в качестве примера с украшениями, я пытался вызвать электронику из текущего списка. Я изменил adapter.recyclerDiffer.currentlist.filter{} на list.filter{}. Проблема была решена с помощью этого кода.

                                  1 -> {
                            filteredList.clear()
                            adapter.recyclerListDiffer.submitList(list.filter { it.category == selectedItemList[0] })
                            filteredList.addAll(list.filter { it.category == selectedItemList[0] })

                        }

Кстати, в коде была еще одна ошибка, как сказал этот пользователь ("Mert"). Было много методов наблюдения. Его нужно удалить и вызвать один раз. Спасибо ему.

Другие вопросы по тегам