Я получаю элементы из room
таблицы базы данных:
@Query("SELECT * FROM items WHERE owner_id = :ownerId ORDER BY type, position")
abstract override fun itemsDataSourceFactory(ownerId: Int): DataSource.Factory<Int, Item>
PagedList создается с использованием
val builder = LivePagedListBuilder(
dataSourceFactory,
PagedList.Config.Builder()
.setEnablePlaceholders(true)
.setPageSize(ITEMS_PER_PAGE)
.build()
)
.setBoundaryCallback(boundaryCallback)
boundaryCallback
, загружает элементы из сети и вставляет их в room
database.
Проблема в том, что, когда пользователь быстро прокручивает / перебрасывает элементы списка внизу списка, начинают прыгать.Как будто они перемещаются из одной позиции в другую.А после 1-2 прыжков стабилизируется на правильных позициях.Отладка DiffUtil
Я вижу, что он сообщает dispatchRemovals
, хотя элементы не удаляются - просто добавляются.
Другое дело - элементы, извлеченные из room
через DataSource
, не имеют постоянного размера или того же размера страницы.
val dataSourceFactory = dao.itemsDataSourceFactory(userId)
.mapByPage{ items ->
Log.d("${items.map { it.position }}")
items
}
Приведенный выше код регистрирует очень разные результаты.Размер страницы может быть от 1 любого элемента в таблице до 20 элементов в разных позициях.Например:
[100, 101, 102, 103, 104]
[80]
[60, 61, 62, 63,64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79]
Таким образом, порядок работает, как и ожидалось, но размеры страниц странные.Не уверен, почему это происходит.
Использование android.arch.paging:1.0.1
и room
версии 1.1.1
Проверено на последней версии androidx.paging:paging-runtime:2.1.0-rc01
с такими же результатами.