Удалить список AsyncListDiffer и обновить его после закрытия поиска (отправить нуль не работает)

В этом приложении я использую AsyncListDiffer. У меня есть панель инструментов с панелью поиска и значком поиска. Я пытаюсь удалить старый список поиска, когда пользователь нажимает на закрытый поиск и делает новый запрос на вызов, а затем отправляет новый, кажетсяsubmitList(null)вызывается, но новое значение не влияет Я вижу пустой экран

различатьОбратный звонок

          private val differCallback = object : DiffUtil.ItemCallback<Item>() {
        override fun areItemsTheSame(oldItem: Item, newItem: Item): Boolean {
            return (oldItem.id == newItem.id)
        }

        override fun areContentsTheSame(oldItem: Item, newItem: Item): Boolean {
          return (oldItem == newItem)
        }
    }

    val differ = AsyncListDiffer(this, differCallback)

главный requestApiData

      private fun requestApiData() {
        showShimmerEffect()
        Log.d(TAG, "requestApiData: called")
        postViewModel.getPostListByLabel()
        postViewModel.postsResponse.observe(viewLifecycleOwner) { response ->
            postsAPiFlag = true
            when (response) {
                is NetworkResult.Success -> {
                    hideShimmerEffect()
                    response.data?.let {
                        binding.progressBar.visibility = View.GONE
                        adapter.differ.submitList(it.items.toList())
                    }

                }

                is NetworkResult.Error -> {
                    hideShimmerEffect()
                    binding.progressBar.visibility = View.GONE
                    //                    loadDataFromCache()
//                    Toast.makeText(
//                        requireContext(),
//                        response.message.toString(),
//                        Toast.LENGTH_LONG
//                    ).show()

                    Log.e(TAG, response.data.toString())
                    Log.e(TAG, response.message.toString())
                }

                is NetworkResult.Loading -> {
                    binding.progressBar.visibility = View.VISIBLE


                }
            }

        }
    }

метод поискового API

      
    private fun requestSearchApi(keyword: String) {

        if (Utils.hasInternetConnection(requireContext())) {

//            postViewModel.getPosts().cancel()
            showShimmerEffect()

            postViewModel.finalURL.value =
                "${BASE_URL}?labels=Accessory&maxResults=500&key=$API_KEY"

            postViewModel.getItemsBySearch()
            postViewModel.searchedPostsResponse.observe(this) { response ->
                when (response) {
                    is NetworkResult.Success -> {
                        postsAPiFlag = false
                        //                                adapter.differ.currentList.clear()

                        if (searchItemList.isNotEmpty()) {
                            searchItemList.clear()
                        }

                        binding.progressBar.visibility = View.GONE

                        lifecycleScope.launch {
                            searchItemList = async {
                                response.data?.items?.filter {
                                    it.title.contains(keyword) || it.content.contains(keyword)
                                } as ArrayList<Item>
                            }.await()
                        }

                        Log.d(TAG, "requestSearchApi: test size ${searchItemList.size}")


                        if (searchItemList.isEmpty()) {
//                                adapter.differ.submitList(null)
                            Toast.makeText(
                                requireContext(),
                                "The search word was not found in any post",
                                Toast.LENGTH_SHORT
                            ).show()
                            hideShimmerEffect()
                            return@observe

                        } else {
                            postsAPiFlag = false

//                            adapter.differ.submitList(null)

                            binding.accessoryRecyclerView.removeAllViews()
                            binding.accessoryRecyclerView.recycledViewPool.clear()
                            hideShimmerEffect()

                            adapter.differ.submitList(searchItemList.toList())
//                            binding.accessoryRecyclerView.scrollToPosition(0)
                        }

                    }
                    is NetworkResult.Error -> {
                        hideShimmerEffect()
                        binding.progressBar.visibility = View.GONE
                        Toast.makeText(
                            requireContext(),
                            response.message.toString(),
                            Toast.LENGTH_SHORT
                        ).show()
                        Log.e(TAG, "onQueryTextSubmit: $response")

                    }

                    is NetworkResult.Loading -> {
                        binding.progressBar.visibility = View.VISIBLE

                    }
                }
            }
        } else {
            noInternetConnectionLayout()
        }
    }

searchView.setOnCloseListener

       searchView.setOnCloseListener {

            setOnCloseListenerFlag = true
            if (keyword.isNullOrEmpty()) {
                return@setOnCloseListener false
            }
            if (Utils.hasInternetConnection(requireContext())) {
                showShimmerEffect()

                searchItemList.clear()
                adapter.differ.submitList(null)
                postViewModel.postListResponse = null
                linearLayoutManager?.removeAllViews()

                postViewModel.finalURL.value =
                    BASE_URL_POSTS_BY_LABEL + "posts?labels=Accessory&key=$API_KEY"

                requestApiData() //====> Here I call the request api method again
//                adapter.notifyDataSetChanged()

                Log.d(
                    TAG,
                    "setOnCloseListener: called ${adapter.differ.currentList.size.toString()}"
                )
//                adapter.notifyDataSetChanged()
//                binding.progressBar.visibility = View.GONE
//


                Log.d(TAG, "setOnCloseListener: ${postViewModel.finalURL.value.toString()}")
//
//                    adapter.notifyDataSetChanged()
//                }
            } else {
                Log.d(TAG, "setOnCloseListener: called")
                adapter.differ.submitList(null)
                searchItemList.clear()
                noInternetConnectionLayout()
            }
            false
        }

Я пробовал некоторые методы в этом вопросе, напримерadapter.notifyDataSetChanged()после отправки null, но тоже не работает

Результат

1 ответ

Просто создайте функцию с именем clearList в своем пользовательском классе адаптера. получить объект списка и вызвать для него функцию .clear(). Затем вызовите notifyDataSetChanged(), и все готово.

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