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

ListenableFuturePagingSource

public abstract class ListenableFuturePagingSource<Key extends Object, Value extends Object> extends PagingSource

java.lang.Object
   ↳ androidx.paging.PagingSource
     ↳ androidx.paging.ListenableFuturePagingSource

ListenableFuture-based compatibility wrapper around PagingSource's suspending APIs.

import androidx.paging.ListenableFuturePagingSource
import androidx.paging.PagingState

class MyListenableFuturePagingSource(
    val myBackend: GuavaBackendService,
    val searchTerm: String
) : ListenableFuturePagingSource<String, Item>() {
    override fun loadFuture(
        params: LoadParams<String>
    ): ListenableFuture<LoadResult<String, Item>> {
        return myBackend
            .searchUsers(
                searchTerm = searchTerm,
                pageKey = params.key
            )
            .transform<LoadResult<String, Item>>(
                { response ->
                    LoadResult.Page(
                        data = response!!.items,
                        prevKey = response.prev,
                        nextKey = response.next
                    )
                },
                networkExecutor
            )
            // Retrofit calls that return the body type throw either IOException for
            // network failures, or HttpException for any non-2xx HTTP status codes.
            // This code reports all errors to the UI, but you can inspect/wrap the
            // exceptions to provide more context.
            .catching(
                IOException::class.java,
                { t: IOException? -> LoadResult.Error(t!!) },
                networkExecutor
            )
            .catching(
                HttpException::class.java,
                { t: HttpException? -> LoadResult.Error(t!!) },
                networkExecutor
            )
    }

    override fun getRefreshKey(state: PagingState<String, Item>): String? {
        return state.anchorPosition?.let { state.closestItemToPosition(it)?.id }
    }
}

Summary

Public constructors

<Key extends Object, Value extends Object> ListenableFuturePagingSource()

Public methods

@NonNull PagingSource.LoadResult<@NonNull Key, @NonNull Value>

Loading API for PagingSource.

abstract @NonNull ListenableFuture<@NonNull PagingSource.LoadResult<@NonNull Key, @NonNull Value>>

Loading API for PagingSource.

Inherited methods

From androidx.paging.PagingSource
final boolean

Whether this PagingSource has been invalidated, which should happen when the data this PagingSource represents changes since it was first instantiated.

boolean

true if this PagingSource supports jumping, false otherwise.

boolean

true if this PagingSource expects to re-use keys to load distinct pages without a call to invalidate, false otherwise.

abstract Key

Provide a Key used for the initial load for the next PagingSource due to invalidation of this PagingSource.

final void

Signal the PagingSource to stop loading.

final void
registerInvalidatedCallback(
    @NonNull Function0<Unit> onInvalidatedCallback
)

Add a callback to invoke when the PagingSource is first invalidated.

final void
unregisterInvalidatedCallback(
    @NonNull Function0<Unit> onInvalidatedCallback
)

Remove a previously added invalidate callback.

Public constructors

ListenableFuturePagingSource

public <Key extends Object, Value extends Object> ListenableFuturePagingSource()

Public methods

load

public @NonNull PagingSource.LoadResult<@NonNull Key, @NonNull Value> load(@NonNull PagingSource.LoadParams<@NonNull Key> params)

Loading API for PagingSource.

Implement this method to trigger your async load (e.g. from database or network).

loadFuture

public abstract @NonNull ListenableFuture<@NonNull PagingSource.LoadResult<@NonNull Key, @NonNull Value>> loadFuture(@NonNull PagingSource.LoadParams<@NonNull Key> params)

Loading API for PagingSource.

Implement this method to trigger your async load (e.g. from database or network).