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"). Было много методов наблюдения. Его нужно удалить и вызвать один раз. Спасибо ему.