Я делаю приложение со списком TO-DO и хочу иметь этот необычный список, в котором задачи сгруппированы под заголовком с датой (аналогично тому, что Splen-DO). Я использую библиотеку Android Paging (с RecyclerView) с комнатой (как хранилище данных). Для заголовков я использую типы представления RecyclerView, а для добавления заголовков в список я использую настраиваемый источник данных, который обертывает источник данных комнаты и вместо возврата объекта задачи он возвращает объект, который может быть либо задачей, либо Заголовок.
Работает это так:
- Библиотека подкачки запрашивает у моего источника данных загрузку элементов, вычисляет смещение, вызванное заголовками, загружает данные из базы данных, добавляет заголовки в список задач (и заголовков) и возвращает его.
- Библиотека подкачки страниц использует мой адаптер для создания ViewHolders и представлений и отображает результат
Все работает нормально, пока я не внесу изменения в базу данных. Элементы перемещаются в RecyclerView без причины, некоторые дублируются, и есть несколько пустых заполнителей на начальном этапе RecyclerView. До сих пор я пытался решить пустые заполнители в вопросе попрошайничества.
Сначала я проверил свой источник данных, он возвращает правильные данные без смещения. Потом проверил переходник. Метод getItem () возвращает все элементы со смещением и некоторые нулевые элементы в начале. Когда я начал копать глубже, я обнаружил, что это вызвано некоторым mLoadingNullCount в PagedStorage, для которого я понятия не имею, для чего он используется, потому что у него нет документации.
Скриншоты
Список работает справа
Список работает справа
Пустые заполнители вверху списка, после того как я внес в него изменения
Пустые заполнители
Список ошибок (gif)
Список ошибок
Некоторый код
Не обращайте внимания на некоторые имена переменных и классов, я использую несколько чешских слов, чтобы они не мешали некоторым системным классам.
Ukol = Задача
Адаптер: UkolListAdapter.java
Источник данных: _ 2_
Фрагмент: UkolListFragment.java
Примечания
Если вам нужен еще код или объяснение, просто оставьте комментарий, я добавлю его для вас.
Редактировать
Я нашел ошибку. Источник данных из базы данных Room может не давать вам список, начинающийся там, где вы запрашивали, но где он хочет, на loadInitial()
и дает вам индекс (где начинается возвращаемый список) в int position
параметре onResult()
. Итак, я возвращал неверные данные о loadInitial()
. Поэтому я добавил несколько алгоритмов, которые вычисляют, какие данные я действительно возвращаю в LoadInitial()
. Я не исправил проблему.