{% setvar book_path %}/reference/androidx/_book.yaml{% endsetvar %} {% include "_shared/_reference-head-tags.html" %}

PagingRx

{% setvar page_path %}androidx/paging/rxjava3/PagingRx.html{% endsetvar %} {% setvar can_switch %}1{% endsetvar %} {% include "reference/_java_switcher2.md" %}

public final class PagingRx


Summary

Public methods

static final @ExperimentalCoroutinesApi @NonNull <ERROR CLASS><@NonNull PagingData<@NonNull T>>
<T extends Object> cachedIn(
    @NonNull <ERROR CLASS><@NonNull PagingData<@NonNull T>> receiver,
    @NonNull CoroutineScope scope
)

Operator which caches an Observable of PagingData within a CoroutineScope.

static final @ExperimentalCoroutinesApi @NonNull <ERROR CLASS><@NonNull PagingData<@NonNull T>>
<T extends Object> cachedIn(
    @NonNull <ERROR CLASS><@NonNull PagingData<@NonNull T>> receiver,
    @NonNull CoroutineScope scope
)

Operator which caches a Flowable of PagingData within a CoroutineScope.

static final @<ERROR CLASS> @NonNull PagingData<@NonNull T>
<T extends Object> filter(
    @NonNull PagingData<@NonNull T> receiver,
    @NonNull Function1<@NonNull T, @NonNull <ERROR CLASS><@NonNull Boolean>> predicate
)

Returns a PagingData containing only elements matching the given predicate.

static final @<ERROR CLASS> @NonNull PagingData<@NonNull R>
<T extends Object, R extends Object> flatMap(
    @NonNull PagingData<@NonNull T> receiver,
    @NonNull Function1<@NonNull T, @NonNull <ERROR CLASS><@NonNull Iterable<@NonNull R>>> transform
)

Returns a PagingData of all elements returned from applying the given transform to each element, as it is loaded.

static final @<ERROR CLASS> @NonNull PagingData<@NonNull R>
<T extends R, R extends Object> insertSeparators(
    @NonNull PagingData<@NonNull T> receiver,
    @NonNull Function2<@NonNull T, @NonNull T, @NonNull <ERROR CLASS><@NonNull R>> generator
)

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).

static final @<ERROR CLASS> @NonNull PagingData<@NonNull R>
<T extends Object, R extends Object> map(
    @NonNull PagingData<@NonNull T> receiver,
    @NonNull Function1<@NonNull T, @NonNull <ERROR CLASS><@NonNull R>> transform
)

Returns a PagingData containing the result of applying the given transform to each element, as it is loaded.

Public methods

cachedIn

@ExperimentalCoroutinesApi
@NonNull
public static final @ExperimentalCoroutinesApi <ERROR CLASS><@NonNull PagingData<@NonNull T>> <T extends Object> cachedIn(
    @NonNull <ERROR CLASS><@NonNull PagingData<@NonNull T>> receiver,
    @NonNull CoroutineScope scope
)

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
@NonNull CoroutineScope scope

The CoroutineScope where the page cache will be kept alive. Typically this would be a managed scope such as ViewModel.viewModelScope, which automatically cancels after the PagingData stream is no longer needed. Otherwise, the provided CoroutineScope must be manually cancelled to avoid memory leaks.

cachedIn

@ExperimentalCoroutinesApi
@NonNull
public static final @ExperimentalCoroutinesApi <ERROR CLASS><@NonNull PagingData<@NonNull T>> <T extends Object> cachedIn(
    @NonNull <ERROR CLASS><@NonNull PagingData<@NonNull T>> receiver,
    @NonNull CoroutineScope scope
)

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
@NonNull CoroutineScope scope

The CoroutineScope where the page cache will be kept alive. Typically this would be a managed scope such as ViewModel.viewModelScope, which automatically cancels after the PagingData stream is no longer needed. Otherwise, the provided CoroutineScope must be manually cancelled to avoid memory leaks.

filter

@<ERROR CLASS>
@NonNull
public static final @<ERROR CLASS> PagingData<@NonNull T> <T extends Object> filter(
    @NonNull PagingData<@NonNull T> receiver,
    @NonNull Function1<@NonNull T, @NonNull <ERROR CLASS><@NonNull Boolean>> predicate
)

Returns a PagingData containing only elements matching the given predicate.

flatMap

@<ERROR CLASS>
@NonNull
public static final @<ERROR CLASS> PagingData<@NonNull R> <T extends Object, R extends Object> flatMap(
    @NonNull PagingData<@NonNull T> receiver,
    @NonNull Function1<@NonNull T, @NonNull <ERROR CLASS><@NonNull Iterable<@NonNull R>>> transform
)

Returns a PagingData of all elements returned from applying the given transform to each element, as it is loaded.

insertSeparators

@<ERROR CLASS>
@NonNull
public static final @<ERROR CLASS> PagingData<@NonNull R> <T extends R, R extends Object> insertSeparators(
    @NonNull PagingData<@NonNull T> receiver,
    @NonNull Function2<@NonNull T, @NonNull T, @NonNull <ERROR CLASS><@NonNull R>> generator
)

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.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().toUpperCase().toString()
            } else {
                // no separator - either end of list, or first letters of before/after are the same
                null
            }
        }.subscribeOn(Schedulers.computation())
    }
}
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().toUpperCase())
                } else {
                    // no separator - either end of list, or first letters of before/after are the same
                    null
                }
            }.subscribeOn(Schedulers.computation())
        }
}

map

@<ERROR CLASS>
@NonNull
public static final @<ERROR CLASS> PagingData<@NonNull R> <T extends Object, R extends Object> map(
    @NonNull PagingData<@NonNull T> receiver,
    @NonNull Function1<@NonNull T, @NonNull <ERROR CLASS><@NonNull R>> transform
)

Returns a PagingData containing the result of applying the given transform to each element, as it is loaded.