LoadStateAdapter

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(
    LayoutInflater.from(parent.context)
        .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) {
        View.VISIBLE
    } else {
        View.GONE
    }
}

/**
 * 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) =
        holder.bind(loadState)
}

Summary

Public fields

final @NonNull LoadState

LoadState to present in the adapter.

Public constructors

Public methods

boolean

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.

int

Override this method to use different view types per LoadState.

final void
onBindViewHolder(@NonNull VH holder, int position)

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

abstract void
onBindViewHolder(@NonNull VH holder, @NonNull LoadState loadState)

Called to bind the passed LoadState to the ViewHolder.

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

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

abstract @NonNull VH

Called to create a ViewHolder for the given LoadState.

Inherited methods

From class RecyclerView.Adapter
final void
bindViewHolder(@NonNull VH holder, int position)
boolean
final @NonNull VH
createViewHolder(@NonNull ViewGroup parent, int viewType)
int
long
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