Библиотека подкачки Android с пользовательскими источниками данных смещает элементы в RecyclerView - PullRequest
0 голосов
/ 13 мая 2018

Я делаю приложение со списком 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(). Я не решил проблему.

1 Ответ

0 голосов
/ 06 июня 2018

Вы пробовали setEnablePlaceholders(false) в PagedList.config.Builder?

https://developer.android.com/topic/libraries/architecture/paging/data#define-paging-config

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