public abstract class LoadStateAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter

Adapter for displaying a RecyclerView item based on LoadState, such as a loading spinner, or a retry error button.

By default will use one shared view type for all items.

By default, both LoadState.Loading and LoadState.Error are presented as adapter items, other states are not. To configure this, override displayLoadStateAsItem.

To present this Adapter as a header and or footer alongside your PagingDataAdapter, see PagingDataAdapter.withLoadStateHeaderAndFooter, or use ConcatAdapter directly to concatenate Adapters.

class LoadStateViewHolder(
    parent: ViewGroup,
    retry: () -> Unit
) : RecyclerView.ViewHolder(
        .inflate(R.layout.load_state_item, parent, false)
) {
    private val progressBar: ProgressBar = itemView.findViewById(R.id.progress_bar)
    private val errorMsg: TextView = itemView.findViewById(R.id.error_msg)
    private val retry: Button = itemView.findViewById<Button>(R.id.retry_button)
        .also { it.setOnClickListener { retry.invoke() } }

    fun bind(loadState: LoadState) {
        if (loadState is LoadState.Error) {
            errorMsg.text = loadState.error.localizedMessage
        progressBar.visibility = toVisibility(loadState is LoadState.Loading)
        retry.visibility = toVisibility(loadState !is LoadState.Loading)
        errorMsg.visibility = toVisibility(loadState !is LoadState.Loading)

    private fun toVisibility(constraint: Boolean): Int = if (constraint) {
    } else {

 * Adapter which displays a loading spinner when `state = LoadState.Loading`, and an error
 * message and retry button when `state is LoadState.Error`.
class MyLoadStateAdapter(
    private val retry: () -> Unit
) : LoadStateAdapter<LoadStateViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, loadState: LoadState) =
        LoadStateViewHolder(parent, retry)

    override fun onBindViewHolder(holder: LoadStateViewHolder, loadState: LoadState) =


Public fields

final @NonNull LoadState

LoadState to present in the adapter.

Public constructors

Public methods


Returns true if the LoadState should be displayed as a list item when active.

final int

Returns the total number of items in the data set held by the adapter.

final int
getItemViewType(int position)

Return the view type of the item at position for the purposes of view recycling.


Override this method to use different view types per LoadState.

final void
onBindViewHolder(VH holder, int position)

Called by RecyclerView to display the data at the specified position.

abstract void
onBindViewHolder(VH holder, LoadState loadState)

Called to bind the passed LoadState to the ViewHolder.

final @NonNull VH
onCreateViewHolder(ViewGroup parent, int viewType)

Called when RecyclerView needs a new ViewHolder of the given type to represent an item.

abstract @NonNull VH
onCreateViewHolder(ViewGroup parent, LoadState loadState)

Called to create a ViewHolder for the given LoadState.

Inherited methods

From class RecyclerView.Adapter
final void
bindViewHolder(@NonNull VH holder, int position)
final @NonNull VH
createViewHolder(@NonNull ViewGroup parent, int viewType)
    @NonNull RecyclerView.Adapter<RecyclerView.ViewHolder> adapter,
    @NonNull RecyclerView.ViewHolder viewHolder,
    int localPosition
getItemId(int position)
final @NonNull RecyclerView.Adapter.StateRestorationPolicy
final boolean
final boolean
final void
final void
notifyItemChanged(int position)
final void
notifyItemChanged(int position, @Nullable Object payload)
final void
notifyItemInserted(int position)
final void
notifyItemMoved(int fromPosition, int toPosition)
final void
notifyItemRangeChanged(int positionStart, int itemCount)
final void
    int positionStart,
    int itemCount,
    @Nullable Object payload
final void
notifyItemRangeInserted(int positionStart, int itemCount)
final void
notifyItemRangeRemoved(int positionStart, int itemCount)
final void
notifyItemRemoved(int position)