androidx.paging.rxjava2
Classes
RxPagingSource |
Rx-based compatibility wrapper around |
RxRemoteMediator |
RxJava2 compatibility wrapper around |
Extension functions summary
Observable<PagingData<T>> |
@ExperimentalCoroutinesApi Operator which caches an |
Flowable<PagingData<T>> |
@ExperimentalCoroutinesApi Operator which caches a |
PagingData<T> |
<T : Any> PagingData<T>.filterAsync(predicate: (T) -> Single<Boolean>) Returns a |
PagingData<R> |
<T : Any, R : Any> PagingData<T>.flatMapAsync( Returns a |
PagingData<R> |
<T : R, R : Any> PagingData<T>.insertSeparatorsAsync( Returns a |
PagingData<R> |
<T : Any, R : Any> PagingData<T>.mapAsync(transform: (T) -> Single<R>) Returns a |
Extension properties summary
Flowable<PagingData<Value>> |
A |
Observable<PagingData<Value>> |
Pager<Key, Value>.observable An |
Extension functions
cachedIn
@ExperimentalCoroutinesApi
fun <T : Any> Observable<PagingData<T>>.cachedIn(scope: CoroutineScope): Observable<PagingData<T>>
Operator which caches an Observable
of PagingData
within a CoroutineScope
.
cachedIn
multicasts pages loaded and transformed by a PagingData
, allowing multiple observers on the same instance of PagingData
to receive the same events, avoiding redundant work, but comes at the cost of buffering those pages in memory.
Calling cachedIn
is required to allow calling androidx.paging.AsyncPagingDataAdapter on the same instance of PagingData
emitted by Pager
or any of its transformed derivatives, as reloading data from scratch on the same generation of PagingData
is an unsupported operation.
Parameters | |
---|---|
scope: CoroutineScope |
The |
cachedIn
@ExperimentalCoroutinesApi
fun <T : Any> Flowable<PagingData<T>>.cachedIn(scope: CoroutineScope): Flowable<PagingData<T>>
Operator which caches a Flowable
of PagingData
within a CoroutineScope
.
cachedIn
multicasts pages loaded and transformed by a PagingData
, allowing multiple observers on the same instance of PagingData
to receive the same events, avoiding redundant work, but comes at the cost of buffering those pages in memory.
Calling cachedIn
is required to allow calling androidx.paging.AsyncPagingDataAdapter on the same instance of PagingData
emitted by Pager
or any of its transformed derivatives, as reloading data from scratch on the same generation of PagingData
is an unsupported operation.
Parameters | |
---|---|
scope: CoroutineScope |
The |
filterAsync
fun <T : Any> PagingData<T>.filterAsync(predicate: (T) -> Single<Boolean>): PagingData<T>
Returns a PagingData
containing only elements matching the given predicate
.
flatMapAsync
fun <T : Any, R : Any> PagingData<T>.flatMapAsync(
transform: (T) -> Single<Iterable<R>>
): PagingData<R>
Returns a PagingData
of all elements returned from applying the given transform
to each element, as it is loaded.
insertSeparatorsAsync
fun <T : R, R : Any> PagingData<T>.insertSeparatorsAsync(
generator: (T?, T?) -> Maybe<R>
): PagingData<R>
Returns a PagingData
containing each original element, with an optional separator generated by generator
, given the elements before and after (or null, in boundary conditions).
Note that this transform is applied asynchronously, as pages are loaded. Potential separators between pages are only computed once both pages are loaded.
import androidx.paging.insertSeparators import androidx.paging.insertSeparatorsAsync import androidx.paging.rxjava2.insertSeparatorsAsync /* * Create letter separators in an alphabetically sorted list. * * For example, if the input is: * "apple", "apricot", "banana", "carrot" * * The operator would output: * "A", "apple", "apricot", "B", "banana", "C", "carrot" */ pagingDataStream.map { pagingData -> // map outer stream, so we can perform transformations on each paging generation pagingData.insertSeparatorsAsync { before: String?, after: String? -> Maybe.fromCallable<String> { if (after != null && before?.first() != after.first()) { // separator - after is first item that starts with its first letter after.first().uppercaseChar().toString() } else { // no separator - either end of list, or first letters of before/after are // the same null } } .subscribeOn(Schedulers.computation()) } }
import androidx.paging.insertSeparators import androidx.paging.insertSeparatorsAsync import androidx.paging.map import androidx.paging.rxjava2.insertSeparatorsAsync open class UiModel data class ItemUiModel(val item: Item) : UiModel() data class SeparatorUiModel(val char: Char) : UiModel() /* * Create letter separators in an alphabetically sorted list of Items, with UiModel objects. * * For example, if the input is (each an `Item`): * "apple", "apricot", "banana", "carrot" * * The operator would output a list of UiModels corresponding to: * "A", "apple", "apricot", "B", "banana", "C", "carrot" */ pagingDataStream.map { pagingData -> // map outer stream, so we can perform transformations on each paging generation pagingData .map { item -> ItemUiModel(item) // convert items in stream to ItemUiModel } .insertSeparatorsAsync { before: ItemUiModel?, after: ItemUiModel? -> Maybe.fromCallable<UiModel> { if ( after != null && before?.item?.label?.first() != after.item.label.first() ) { // separator - after is first item that starts with its first letter SeparatorUiModel(after.item.label.first().uppercaseChar()) } else { // no separator - either end of list, or first letters of before/after // are the same null } } .subscribeOn(Schedulers.computation()) } }
mapAsync
fun <T : Any, R : Any> PagingData<T>.mapAsync(transform: (T) -> Single<R>): PagingData<R>
Returns a PagingData
containing the result of applying the given transform
to each element, as it is loaded.
Extension properties
flowable
val Pager<Key, Value>.flowable: Flowable<PagingData<Value>>
A Flowable
of PagingData
, which mirrors the stream provided by Pager.flow
, but exposes it as a Flowable
.
NOTE: Instances of PagingData
emitted by this Flowable
are not re-usable and cannot be submitted multiple times. This is especially relevant for transforms, which would replay the latest value downstream. To ensure you get a new instance of PagingData
for each downstream observer, you should use the cachedIn
operator which multicasts the Flowable
in a way that returns a new instance of PagingData
with cached data pre-loaded.
observable
val Pager<Key, Value>.observable: Observable<PagingData<Value>>
An Observable
of PagingData
, which mirrors the stream provided by Pager.flow
, but exposes it as an Observable
.
NOTE: Instances of PagingData
emitted by this Observable
are not re-usable and cannot be submitted multiple times. This is especially relevant for transforms, which would replay the latest value downstream. To ensure you get a new instance of PagingData
for each downstream observer, you should use the cachedIn
operator which multicasts the Observable
in a way that returns a new instance of PagingData
with cached data pre-loaded.