class MyDatasource( private val queryMap: HashMap<String, String>) : ItemKeyedDataSource<String, Order>() { private val compositeDisposable: CompositeDisposable by lazy { CompositeDisposable() } override fun loadInitial(params: LoadInitialParams<String>, callback: LoadInitialCallback<Order>) { compositeDisposable.add( MyService.getService().fetchData(queryMap) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(object : DisposableObserver<OrdersResponse>() { override fun onNext(orders: OrdersResponse) { callback.onResult(orders.data) } override fun onError(e: Throwable) { e.printStackTrace() } override fun onComplete() { } }) ) } override fun loadBefore(params: LoadParams<String>, callback: LoadCallback<Order>) { // do nothing } override fun loadAfter(params: LoadParams<String>, callback: LoadCallback<Order>) { queryMap["offsetOrderId"] = params.key compositeDisposable.add( MyService.getService().fetchData(queryMap) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(object : DisposableObserver<OrdersResponse>() { override fun onNext(orders: OrdersResponse) { callback.onResult(orders.data) } override fun onError(e: Throwable) { } override fun onComplete() { } }) ) } override fun getKey(item: Order): String { return item.orderId } } }
I build pagedlist in my viewmodel
class MyViewModel() : ViewModel() { private var myPagingConfig: PagedList.Config? = null var dataList: LiveData<PagedList<Order>>? = null fun getOrders(params: HashMap<String, String>) { if (myPagingConfig == null) { myPagingConfig = PagedList.Config.Builder() .setPageSize(LIMIT) .setPrefetchDistance(10) .setEnablePlaceholders(false) .build() } dataList = LivePagedListBuilder(MyDataFactory( MyDatasource(params)), myPagingConfig!!) .setInitialLoadKey(null) .setFetchExecutor(Executors.newFixedThreadPool(5)) .build() } } }