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
RecyclerView.Adapter#setStateRestorationPolicy()
: Especifica cómo un objetoRecyclerView.Adapter
restablece su estado después de un cambio de configuración.ViewModel
: Contiene el estado de una actividad o un fragmento.
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:
![](https://developer.android.google.cn/static/images/quick-guides/collection-illustration.png?hl=es-419)