I'm trying to load Products
items from a Parse Server
database using data source type of PositionalDataSource()
to be able to fetch pages of items while scrolling down.
This what i've done so far :
My PositionalDataSource() class
class ParsePositionalDataSource: PositionalDataSource<Product>() {
private fun getQuery() : ParseQuery<Product> {
return ParseQuery.getQuery(Product::class.java).orderByDescending("createdAt")
}
override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback<Product>) {
val query = getQuery()
query.limit = params.loadSize
query.skip = params.startPosition
val products = query.find()
callback.onResult(products)
}
override fun loadInitial(params: LoadInitialParams, callback: LoadInitialCallback<Product>) {
val query = getQuery()
query.limit = params.requestedLoadSize
query.skip = params.requestedStartPosition
val count = query.count()
val products = query.find()
callback.onResult(products, params.requestedStartPosition, count)
}
}
And then a data source factory :
class ParseDataSourceFactory : DataSource.Factory<Int, Product>() {
override fun create(): DataSource<Int, Product> {
return ParsePositionalDataSource()
}
}
And finally my ViewModal class
class CategoryTabViewModel() : ViewModel() {
private var pagedListConfig: PagedList.Config = PagedList.Config.Builder().setEnablePlaceholders(true)
.setPrefetchDistance(5)
.setInitialLoadSizeHint(5)
.setPageSize(5).build()
private val sourceFactory = ParseDataSourceFactory()
private val _productList = LivePagedListBuilder(sourceFactory, pagedListConfig).build()
val x = _productList
//val productList: LiveData<PagedList<Product>> = _productList
fun getProductList(): LiveData<PagedList<Product>> {
return _productList
}
}
I've checked if loadinitial()
returns data by setting a breakpoint after : val products = query.find()
and yes, products
contains a list of Product
But in my ViewModal, _productList
it's always null or empty list.
Do I miss something ?
I've found the solution by my self while digging in debugger console output.
I saw a line that says :
And it works just fine after i added the layoutmanager in my RecyclerView
And the documentation says :
And
It seems that
RecyclerView.Adapter
needsRecyclerView.LayoutManager
to be set.