A RecyclerView
pode mostrar grandes quantidades de dados usando o mínimo de recursos
gráficos. À medida que os usuários rolam os itens em uma RecyclerView
, as instâncias de View
dos itens que rolaram para fora da tela são reutilizadas para criar novos itens
conforme eles aparecem. No entanto, mudanças de configuração, como a rotação do dispositivo,
podem redefinir o estado de uma RecyclerView
, forçando os usuários a rolar novamente para a
posição anterior na lista de itens.
A RecyclerView
precisa manter o estado, principalmente a posição de
rolagem, e o estado dos elementos da lista durante todas as mudanças
de configuração.
manter o estado;
Defina a política de restauração de estado da RecyclerView.Adapter
para salvar a
posição de rolagem da RecyclerView
. Salve o estado dos itens da lista da RecyclerView
. Adicione
o estado dos itens da lista ao adaptador da RecyclerView
e restaure o estado
dos itens da lista quando eles estiverem vinculados a um ViewHolder
.
1. Ativar a política de restauração de estado do Adapter
Ative a política de restauração de estado do adaptador RecyclerView
para que a
posição de rolagem da RecyclerView
seja mantida durante as mudanças
de configuração. Adicione a especificação da política ao construtor do 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. Salvar o estado dos itens da lista com estado
Salve o estado de itens complexos da lista da RecyclerView
, como aqueles que contêm
elementos EditText
. Por exemplo, para salvar o estado de uma EditText
, adicione um
callback semelhante a um gerenciador onClick
para capturar mudanças de texto. No callback, defina quais dados serão salvos:
Kotlin
input.addTextChangedListener( afterTextChanged = { text -> text?.let { // Save state here. } } )
Java
input.addTextChangedListener(new TextWatcher() { ... @Override public void afterTextChanged(Editable s) { // Save state here. } });
Declare o callback na Activity
ou no Fragment
. Use um ViewModel
para
armazenar o estado.
3. Adicionar o estado dos itens da lista ao Adapter
Adicione o estado dos itens da lista a RecyclerView.Adapter
. Transmita o estado do item
ao construtor do adaptador quando a Activity
ou o Fragment
do host forem criados:
Kotlin
val adapter = MyAdapter(items, viewModel.retrieveState())
Java
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
4. Recuperar o estado dos itens da lista no ViewHolder
do adaptador
Na RecyclerView.Adapter
, restaure o estado de um item ao vincular um ViewHolder
a ele:
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)); }
Pontos principais
RecyclerView.Adapter#setStateRestorationPolicy()
: especifica como umaRecyclerView.Adapter
restaura o estado após uma mudança de configuração.ViewModel
: mantém o estado de uma atividade ou um fragmento.
Resultados
A RecyclerView
agora pode restaurar a posição de rolagem e o estado de
cada item na lista da RecyclerView
.
Coleções que contêm este guia
Este guia faz parte destas coleções selecionadas de guias rápidos que abrangem objetivos mais amplos de desenvolvimento para Android:
![](https://developer.android.com/static/images/quick-guides/collection-illustration.png?hl=pt-br)