Gerenciar o estado da RecyclerView

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

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:

Permita que seu app ofereça uma experiência otimizada para o usuário em tablets, dobráveis e dispositivos ChromeOS.

Tem dúvidas ou quer dar feedback?

Acesse nossa página de perguntas frequentes e saiba mais sobre os guias rápidos ou entre em contato e conte sua opinião.