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