# ListenableFuturePagingSource

Artifact: [androidx.paging:paging-guava](https://developer.android.com/jetpack/androidx/releases/paging) [View Source](https://cs.android.com/search?q=file:androidx/paging/ListenableFuturePagingSource.kt+class:androidx.paging.ListenableFuturePagingSource) Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

*** ** * ** ***


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

<br />

|---|---|---|
| [java.lang.Object](https://developer.android.com/reference/java/lang/Object.html) |||
| ↳ | [androidx.paging.PagingSource](https://developer.android.com/reference/androidx/paging/PagingSource)\<@[NonNull](https://developer.android.com/reference/androidx/annotation/NonNull) Key, @[NonNull](https://developer.android.com/reference/androidx/annotation/NonNull) Value\> ||
|   | ↳ | [androidx.paging.ListenableFuturePagingSource](https://developer.android.com/reference/androidx/paging/ListenableFuturePagingSource) |

*** ** * ** ***

`https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html`-based compatibility wrapper around `https://developer.android.com/reference/androidx/paging/PagingSource`'s suspending APIs.

```kotlin
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 https://developer.android.com/reference/java/lang/Object.html, Value extends https://developer.android.com/reference/java/lang/Object.html> https://developer.android.com/reference/androidx/paging/ListenableFuturePagingSource#ListenableFuturePagingSource()()` |

| ### Public methods |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/PagingSource.LoadResult<@https://developer.android.com/reference/androidx/annotation/NonNull Key, @https://developer.android.com/reference/androidx/annotation/NonNull Value>` | `https://developer.android.com/reference/androidx/paging/ListenableFuturePagingSource#load(androidx.paging.PagingSource.LoadParams)(@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/PagingSource.LoadParams<@https://developer.android.com/reference/androidx/annotation/NonNull Key> params)` |
| `abstract @https://developer.android.com/reference/androidx/annotation/NonNull https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/PagingSource.LoadResult<@https://developer.android.com/reference/androidx/annotation/NonNull Key, @https://developer.android.com/reference/androidx/annotation/NonNull Value>>` | `https://developer.android.com/reference/androidx/paging/ListenableFuturePagingSource#loadFuture(androidx.paging.PagingSource.LoadParams)(@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/PagingSource.LoadParams<@https://developer.android.com/reference/androidx/annotation/NonNull Key> params)` Loading API for `https://developer.android.com/reference/androidx/paging/PagingSource`. |

### Inherited methods

From [androidx.paging.PagingSource](https://developer.android.com/reference/androidx/paging/PagingSource) `final boolean` `https://developer.android.com/reference/androidx/paging/PagingSource#getInvalid()()` `boolean` `https://developer.android.com/reference/androidx/paging/PagingSource#getJumpingSupported()()` `boolean` `https://developer.android.com/reference/androidx/paging/PagingSource#getKeyReuseSupported()()` `abstract Key` `https://developer.android.com/reference/androidx/paging/PagingSource#getRefreshKey(androidx.paging.PagingState)(@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/PagingState<@https://developer.android.com/reference/androidx/annotation/NonNull Key, @https://developer.android.com/reference/androidx/annotation/NonNull Value> state)` `final void` `https://developer.android.com/reference/androidx/paging/PagingSource#invalidate()()` `final void` `https://developer.android.com/reference/androidx/paging/PagingSource#registerInvalidatedCallback(kotlin.Function0)(
@https://developer.android.com/reference/androidx/annotation/NonNull Function0<https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html> onInvalidatedCallback
)` `final void` `https://developer.android.com/reference/androidx/paging/PagingSource#unregisterInvalidatedCallback(kotlin.Function0)(
@https://developer.android.com/reference/androidx/annotation/NonNull Function0<https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html> onInvalidatedCallback
)`

## 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)
```

### loadFuture

Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

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

Loading API for `https://developer.android.com/reference/androidx/paging/PagingSource`.

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