Позиционный источник данных не загружает все данные
Я пытаюсь экспериментировать с позиционным источником данных. Я создал следующий фиктивный источник.
class ContactsDataSource : PositionalDataSource<Contact>() {
override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback<Contact>) {
val c = ArrayList<Contact>()
for (i in params.startPosition..params.loadSize) {
c.add(Contact("$i contact"))
}
callback.onResult(c)
Logger.d("loadRange: StartPos: ${params.startPosition} LoadSize: ${params.loadSize}")
}
override fun loadInitial(params: LoadInitialParams, callback: LoadInitialCallback<Contact>) {
Logger.d("Load Initial: PageSize: ${params.pageSize} LoadSize: ${params.requestedLoadSize}")
val c = ArrayList<Contact>()
for (i in 0 until params.requestedLoadSize) {
c.add(Contact("$i contact"))
}
callback.onResult(c, 0, 1000)
}
}
class ContactsDsFactory : DataSource.Factory<Int, Contact>() {
override fun create(): DataSource<Int, Contact> {
return ContactsDataSource()
}
}
Впервые звонит loadInitial
и элементы загружены. Когда я прокручиваю вверх, он загружает больше предметов, вызывая loadRange
, После того, как диапазон нагрузки вызывается впервые, он никогда не вызывается снова. Хотя загруженных предметов меньше, чем общее количество, которое я передал в loadInitial
Перезвоните. Вот как я настроил источник.
val config = PagedList.Config.Builder().setEnablePlaceholders(false)
.setMaxSize(120)
.setInitialLoadSizeHint(60)
.setPageSize(20).build()
val list = LivePagedListBuilder<Int, Contact>(ContactsDsFactory(), config)
.build()
val recycler = findViewById<RecyclerView>(R.id.recycler)
recycler.layoutManager = LinearLayoutManager(this)
val adapter = ContactsRecycler()
recycler.adapter = adapter
list.observe(this, Observer {
adapter.submitList(it)
})
Это журнал
D/PagedLab: Load Initial: PageSize: 20 LoadSize: 60
D/PagedLab: loadRange: StartPos: 60 LoadSize: 20
Любая помощь будет оценена.
2 ответа
Я использовал неправильный диапазон for (i in params.startPosition..params.loadSize)
, Сработало после установки правильного диапазона params.startPosition + params.loadSize
,
Я создал класс MovieListDataSource
это расширяет PositionalDataSource
, Дело в том, что вы должны использовать PagedListAdapter
и это позвонит loadAround(int)
, Если все работает хорошо, тогда не будет проблем с загрузкой. Нажмите здесь, и вы получите мою реализацию. Надеюсь, что это поможет вам.