ViewModel возвращает размер ArrayList как ноль - PullRequest
0 голосов
/ 13 ноября 2018

Я использую библиотеку Android Paging для загрузки данных с сервера в моем RecyclerView. Я могу видеть данные правильно, но когда я печатаю размер списка, он возвращает мне ноль.

Ниже мой код:

val itemViewModel =
                ViewModelProviders.of(this, MyViewModelFacotry(disciplineId, schoolId, yearId)).get(StudentInfoViewModel::class.java)
        activity?.let {
            itemViewModel.itemPagedList.observe(it, Observer<PagedList<StudentData>> { studentDataPagedList ->
                if(BuildConfig.DEBUG){
                    Log.i("MainActivity",studentDataPagedList?.size.toString())
                }
                studentInfoNameAdapter?.submitList(studentDataPagedList)
            })

            recyclerView.adapter = studentInfoNameAdapter
        }

Оператор Log печатает всегда ноль. Я хочу показать TextView, если список пуст, но список всегда возвращает размер как ноль.

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Когда вы получаете PagedList в первый раз, оно может быть пустым, если setEnablePlaceholders(false) было предоставлено в качестве конфигурации.Если вы хотите или можете обрабатывать значения null, вы можете включить заполнители.Если данных пока просто нет, возможно, вы захотите взглянуть на разные подходы.

Вы могли бы обернуть свой адаптер специальной реализацией, которая правильно делегирует изменения набора данных и отображает один элемент, когда в исходном адаптере нет элементов.

В документации PagedList указано заполнитель:

Заполнители

Существует два способа, которыми PagedListможет представлять свои еще не загруженные данные - с заполнителями или без них null.

Для заполнителей PagedList всегда имеет полный размер набора данных.get(N) возвращает N -й элемент в наборе данных или null, если он еще не загружен.

Без null заполнителей, PagedList является подсписком данных, которые уже были загружены.Размер PagedList - это количество загруженных в данный момент элементов, а get(N) возвращает N -й загруженный элемент.Это не обязательно N -й элемент в наборе данных.

0 голосов
/ 16 января 2019

Мне удалось показать пустое состояние с помощью RecyclerView.AdapterObserver, как показано ниже:

Инициализировать и зарегистрировать AdapterObserver

        val adapterDataObserver = object : RecyclerView.AdapterDataObserver() {

        override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
            super.onItemRangeInserted(positionStart, itemCount)
            showEmptyState(myAdapter.itemCount == 0)
        }

        override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) {
            super.onItemRangeRemoved(positionStart, itemCount)
            showEmptyState(myAdapter.itemCount == 0)
        }
    }
       myAdapter.registerAdapterDataObserver(adapterDataObserver)

Кроме того, незабудьте отменить регистрацию AdapterObserver в onDestroy()

0 голосов
/ 11 января 2019

Оператор Log печатает всегда ноль. Я хочу показать TextView, если список пуст, но список всегда возвращает размер как ноль.

Если список пуст, его размер должен быть равен нулю, так что это правильное поведение.

Если вы получаете пустой список все время, чем проблема где-то еще, вероятно, там, где вы извлекаете данные и добавляете их в список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...