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 un RecyclerView, se reutilizan las instancias de View de los 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 un 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.

Resultados

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

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 restablécelo 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

Colecciones que contienen esta guía

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

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

Preguntas o comentarios

Visita nuestra página de preguntas frecuentes y consulta las guías rápidas, o bien comunícate con nosotros para contarnos tu opinión.