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, View
as instâncias de 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 da RecyclerView.
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 agora pode restaurar a posição de rolagem e o estado de cada item na lista da RecyclerView.
Compatibilidade de versões
Essa implementação é compatível com todos os níveis da API.
Dependências
Nenhum.
manter o estado;
Defina a política de restauração de estado do RecyclerView.Adapter para salvar a posição de rolagem
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 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 salvar:
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 uma 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, ao vincular um ViewHolder a um item,
restaure o estado do item:
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.Adapterrestaura 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 destas coleções de guias rápidos selecionados que abrangem metas mais amplas de desenvolvimento do Android: