Implement a DataSource using ItemKeyedDataSource if you need to use data from item N - 1
to load item N. This is common, for example, in sorted database queries where
attributes of the item such just before the next query define how to execute it.

The InMemoryByItemRepository in the
PagingWithNetworkSample
shows how to implement a network ItemKeyedDataSource using
Retrofit, while
handling swipe-to-refresh, network errors, and retry.

If your key is more complex, such as when you're sorting by name, then resolving collisions
with integer ID, you'll need to return both. In such a case you would use a wrapper class,
such as Pair<String, Integer> or, in Kotlin,
data class Key(val name: String, val id: Int)

loadAfter

It's valid to return a different list size than the page size if it's easier, e.g. if your
backend defines page sizes. It is generally safer to increase the number loaded than reduce.

Data may be passed synchronously during the loadAfter method, or deferred and called at a
later time. Further loads going down will be blocked until the callback is called.

If data cannot be loaded (for example, if the request is invalid, or the data would be stale
and inconsistent, it is valid to call invalidate() to invalidate the data source,
and prevent further loading.

Parameters

params

LoadParams: Parameters for the load, including the key to load after, and requested size.

loadBefore

It's valid to return a different list size than the page size if it's easier, e.g. if your
backend defines page sizes. It is generally safer to increase the number loaded than reduce.

Note: Data returned will be prepended just before the key
passed, so if you vary size, ensure that the last item is adjacent to the passed key.

Data may be passed synchronously during the loadBefore method, or deferred and called at a
later time. Further loads going up will be blocked until the callback is called.

If data cannot be loaded (for example, if the request is invalid, or the data would be stale
and inconsistent, it is valid to call invalidate() to invalidate the data source,
and prevent further loading.

Parameters

params

LoadParams: Parameters for the load, including the key to load before, and requested size.

callback

LoadCallback: Callback that receives loaded data.

loadInitial

This method is called first to initialize a PagedList with data. If it's possible to count
the items that can be loaded by the DataSource, it's recommended to pass the loaded data to
the callback via the three-parameter
onResult(List, int, int). This enables PagedLists
presenting data from this source to display placeholders to represent unloaded items.

requestedInitialKey and requestedLoadSize
are hints, not requirements, so they may be altered or ignored. Note that ignoring the
requestedInitialKey can prevent subsequent PagedList/DataSource pairs from
initializing at the same location. If your data source never invalidates (for example,
loading from the network without the network ever signalling that old data must be reloaded),
it's fine to ignore the initialLoadKey and always start from the beginning of the
data set.