Cómo administrar el estado de RecyclerView

RecyclerView puede mostrar grandes cantidades de datos usando recursos gráficos mínimos. A medida que los usuarios se desplazan por los elementos de una RecyclerView, se vuelven a usar las instancias de View de elementos que se desplazaron fuera de la pantalla para crear elementos nuevos a medida que se desplazan en la pantalla. Sin embargo, los cambios de configuración, como la rotación del dispositivo, pueden restablecer el estado de una RecyclerView, lo que obliga a los usuarios a desplazarse nuevamente a su posición anterior en la lista de elementos.

RecyclerView debe mantener su estado (en particular, la posición de desplazamiento) y el estado de los elementos de lista durante todos los cambios de configuración.

Mantener el estado

Establece la política de restablecimiento de estado del RecyclerView.Adapter para guardar la posición de desplazamiento de RecyclerView. Guarda el estado de los elementos de lista de RecyclerView. Agrega el estado de los elementos de lista al adaptador RecyclerView y restablece el estado de los elementos de lista cuando estén vinculados a un ViewHolder.

1. Habilita la política de restablecimiento de estado de Adapter

Habilita la política de restablecimiento de estado del adaptador RecyclerView para que se mantenga la posición de desplazamiento de RecyclerView en todos los cambios de configuración. Agrega la especificación de la política al constructor del adaptador:

Kotlin

class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    init {
        stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY
    }
    ...
}

Java

class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public Adapter() {
        setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY);
    }
    ...
}

2. Guarda el estado de los elementos de lista con estado

Guarda el estado de los elementos complejos de la lista RecyclerView, como elementos que contienen elementos EditText. Por ejemplo, para guardar el estado de un EditText, agrega una devolución de llamada similar a un controlador onClick para capturar los cambios de texto. Dentro de la devolución de llamada, define qué datos se guardarán:

Kotlin

input.addTextChangedListener(
    afterTextChanged = { text ->
        text?.let {
            // Save state here.
        }
    }
)

Java

input.addTextChangedListener(new TextWatcher() {

    ...

    @Override
    public void afterTextChanged(Editable s) {
        // Save state here.
    }
});

Declara la devolución de llamada en tu Activity o Fragment. Usa un ViewModel para almacenar el estado.

3. Agrega el estado del elemento de lista a Adapter

Agrega el estado de los elementos de lista a tu RecyclerView.Adapter. Pasa el estado del elemento al constructor del adaptador cuando se cree el host Activity o Fragment:

Kotlin

val adapter = MyAdapter(items, viewModel.retrieveState())

Java

MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());

4. Recupera el estado del elemento de lista en el ViewHolder del adaptador

En RecyclerView.Adapter, cuando vinculas un ViewHolder a un elemento, restablece el estado del elemento:

Kotlin

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    ...
    val item = items[position]
    val state = states.firstOrNull { it.item == item }

    if (state != null) {
        holder.restore(state)
    }
}

Java

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    ...
    Item item = items[position];
    Arrays.stream(states).filter(state -> state.item == item)
        .findFirst()
        .ifPresent(state -> holder.restore(state));
}

Puntos clave

Resultados

Tu RecyclerView ahora puede restablecer su posición de desplazamiento y el estado de cada elemento de la lista RecyclerView.

Colecciones que contienen esta guía

Esta guía forma parte de estas colecciones de guías rápidas seleccionadas que abarcan objetivos más amplios de desarrollo de Android:

Habilita tu app para que admita una experiencia del usuario optimizada en tablets, dispositivos plegables y ChromeOS.

Tienes preguntas o comentarios

Ve a nuestra página de preguntas frecuentes para obtener información sobre las guías rápidas o comunícate con nosotros para contarnos tu opinión.