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.
Resultados
A RecyclerView
pode restaurar a posição de rolagem e o estado de
cada item na lista da RecyclerView
.
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 desses itens ao adaptador da RecyclerView
e restaure o estado 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 da 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, se quiser 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 umRecyclerView.Adapter
restaura o estado após uma mudança de configuração.ViewModel
: mantém o estado de uma atividade ou um fragmento.
Coleções que contêm este guia
Este guia faz parte das coleções de guias rápidos selecionados que abordam metas mais amplas de desenvolvimento para Android:
