Метод onChange AdapterDataObserver работает, но показывает пустой просмотр в течение доли секунды

#android #kotlin #android-recyclerview

#Android #kotlin #android-recyclerview

Вопрос:

В настоящее время я использую RecyclerView с привязкой данных MVVM (ну, привязка данных может не иметь значения). В любом случае, то, что я пытаюсь сделать, это показать определенный вид макета, когда данные в RecyclerView пусты. Он работает, когда я использую AdapterDataObserver OnChanged (следующий код). Но проблема в том, что когда я открываю свое приложение, мой пустой просмотр времени отображается только на долю секунды (например, сбой / щелчки), затем отображаются списки в обычном режиме. Я не могу устранить проблему, чтобы не показывать это пустое представление времени при открытии экрана. Какой-нибудь пример или код будет потрясающим! Я хотел бы услышать от вас!

Часть приведенного ниже кода

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

     viewModel = activity?.run {
         ViewModelProviders.of(this, viewModelFactory).get(ShopViewModel::class.java)
     } ?: throw Exception("Invalid Activity")

     val adapter = ShopRecyclerAdapter(viewModel, mIndex))

     val emptyObserver = object : RecyclerView.AdapterDataObserver() {
         override fun onChanged() {
             val isEmpty = adapter.itemCount == 0
             val isfavImage = if (mIndex == 2) R.drawable.img_fav else R.drawable.img_none
             val isNoData = if (isEmpty || adapter == null) View.VISIBLE else View.GONE
             val visibility = if (isEmpty || adapter == null) View.GONE else View.VISIBLE
             binding.layoutSwipeRefresh.visibility = visibility
             binding.noneLayout.visibility = isNoData
             binding.noneLayout.item_coupon_none_im.setImageResource(isfavImage)
         }
     }
     adapter.registerAdapterDataObserver(emptyObserver)
     emptyObserver.onChanged()


     val recyclerView: RecyclerView = binding.shopRecycleView
     val layoutManager = GridLayoutManager(activity, 1, RecyclerView.VERTICAL, false)
     recyclerView.layoutManager = layoutManager
  

Ответ №1:

Как вы получаете данные для списка? Допустим, у вас есть loading state , у которого есть только счетчик загрузки. После получения данных для списка зарегистрируйте observer, чтобы отобразить либо пустое представление, либо заполнить список

Комментарии:

1. Из ModelView из репозитория с использованием Retrofit

2. затем вы можете зарегистрироваться emptyObserver после запроса сервера. или вызовите свой emptyObserver.onChanged() после возврата запроса