Personalização avançada do RecyclerView Parte do Android Jetpack.
Você pode personalizar os objetos RecyclerView
para
atender às suas necessidades específicas. As classes padrão descritas na seção
Criar listas dinâmicas com o
RecyclerView fornecem toda a funcionalidade
que a maioria dos desenvolvedores precisa. E em muitos casos, a única personalização que você precisa
fazer é projetar a visualização para cada fixador de visualização e criar o código para atualizar
essas visualizações com os dados apropriados. No entanto, se seu app tiver requisitos
específicos, você poderá modificar o comportamento padrão de várias maneiras. Esta
página descreve algumas das outras possibilidades de personalizações.
Como modificar o layout
O RecyclerView
usa um gerenciador de layout para
posicionar os itens individuais na tela e determinar quando reutilizar visualizações de itens que não
estão mais visíveis para o usuário. Para reutilizar (ou reciclar) uma visualização, um gerenciador de layout pode solicitar
que o adaptador substitua o conteúdo da visualização por um elemento diferente do conjunto de dados. Reciclar
visualizações dessa maneira melhora o desempenho, evitando a criação de visualizações desnecessárias ou
a realização de pesquisas findViewById()
caras. A Biblioteca
de Suporte do Android inclui três gerenciadores de layout padrão, e cada um deles oferece muitas opções de
personalização:
LinearLayoutManager
organiza os itens em uma lista unidimensional. O uso de umRecyclerView
comLinearLayoutManager
fornece funcionalidades como o layoutListView
mais antigo.GridLayoutManager
organiza os itens em uma grade bidimensional, como os quadrados em um quadriculado. O uso de umRecyclerView
comGridLayoutManager
fornece funcionalidades como o layoutGridView
mais antigo.StaggeredGridLayoutManager
organiza os itens em uma grade bidimensional, com cada coluna um pouco diferente da anterior, por exemplo, as estrelas em uma bandeira americana.
Se nenhum desses gerenciadores de layout atende às suas necessidades, você pode criar um gerenciador próprio,
estendendo a classe
abstrata RecyclerView.LayoutManager
.
Adicionar animações de itens
Sempre que um item muda, o RecyclerView
usa um animador para alterar a aparência dele. Esse animador é um objeto que
estende a classe RecyclerView.ItemAnimator
abstrata. Por padrão, o
RecyclerView
usa DefaultItemAnimator
para
fornecer a animação. Para fornecer animações personalizadas, defina
um objeto animador próprio, estendendo RecyclerView.ItemAnimator
.
Ativar a seleção de itens de lista
A
biblioteca recyclerview-selection
permite que os usuários selecionem itens na
lista RecyclerView
usando a entrada por toque ou mouse.
Você mantém o controle sobre a apresentação visual de um item selecionado. Você
também pode manter o controle sobre as políticas que controlam o comportamento de seleção, por exemplo,
itens que podem ser qualificados para seleção e quantos itens podem ser selecionados.
Para adicionar suporte de seleção a uma
instância do RecyclerView
, siga estas etapas:
- Determine qual tipo de chave de seleção usar e crie um
ItemKeyProvider
.Você pode usar três tipos de chave para identificar itens selecionados:
Parcelable
(e todas as subclasses, comoUri
),String
eLong
. Para ver informações detalhadas sobre os tipos de chave de seleção, consulteSelectionTracker.Builder
. - Implemente
ItemDetailsLookup
. - Atualize o item
Views
emRecyclerView
para indicar que ele foi selecionado ou desmarcado pelo usuário.A biblioteca de seleção não fornece uma decoração visual padrão para os itens selecionados. Você precisa fornecer isso quando implementar
onBindViewHolder()
. A abordagem recomendada é a seguinte:- Em
onBindViewHolder()
, chamesetActivated()
(nãosetSelected()
) no objetoView
comtrue
oufalse
(dependendo do item estar ou não selecionado). - Atualize o estilo da visualização para representar o status ativado. Recomendamos que você use um recurso de lista de estados de cor para configurar o estilo.
- Em
- Use
ActionMode
para fornecer ao usuário ferramentas para executar uma ação na seleção. - Realizar ações secundárias interpretadas
- Montar tudo com
SelectionTracker.Builder
- Inclua seleção nos eventos de ciclo de vida da atividade.
ItemDetailsLookup
permite que a biblioteca de seleção acesse informações sobre
itens RecyclerView
que receberam
MotionEvent
.
Ele é efetivamente uma fábrica para instâncias de
ItemDetails
que são armazenadas em backup por (ou extraídas de) uma
instância de RecyclerView.ViewHolder
.
Registre um SelectionTracker.SelectionObserver
para ser notificado quando a seleção mudar. Quando uma seleção for criada pela primeira vez,
inicie ActionMode
para representar isso para o
usuário e forneça ações específicas para a seleção. Por exemplo, você pode adicionar um
botão "Excluir" à barra ActionMode
e
conectar a seta "Voltar" à barra para limpar a seleção. Quando a seleção
ficar vazia (se o usuário limpou a seleção pela última vez), não
se esqueça de encerrar o modo de ação.
No final do pipeline de processamento de eventos, a biblioteca pode determinar que
o usuário está tentando ativar um item tocando nele ou tentando
arrastar e soltar um item ou conjunto de itens selecionados. Reaja a essas
interpretações registrando o listener apropriado. Para mais
informações, consulte:
SelectionTracker.Builder
.
O exemplo a seguir mostra como juntar essas partes usando a
tecla de seleção Long
:
Kotlin
var tracker = SelectionTracker.Builder( "my-selection-id", recyclerView, StableIdKeyProvider(recyclerView), MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build()
Java
SelectionTracker tracker = new SelectionTracker.Builder<>( "my-selection-id", recyclerView, new StableIdKeyProvider(recyclerView), new MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build();
Para criar uma instância de
SelectionTracker
,
seu app precisa fornecer o mesmo
RecyclerView.Adapter
que você usou para
inicializar RecyclerView
para
SelectionTracker.Builder
.
Por esse motivo, você provavelmente precisará injetar a instância de
SelectionTracker
,
uma vez criada, no seu
RecyclerView.Adapter
depois que
RecyclerView.Adapter
for
criado. Caso contrário, você não poderá verificar o status selecionado de um item com
o método
onBindViewHolder()
.
Para preservar o estado de seleção em todos os eventos de
ciclo de vida da atividade,
seu app precisa chamar os métodos
onSaveInstanceState()
e
onRestoreInstanceState()
do rastreador de seleção dos métodos
onSaveInstanceState()
e
onRestoreInstanceState()
da atividade, respectivamente. Seu app também precisa fornecer um ID de seleção exclusivo para o
construtor
SelectionTracker.Builder
. Esse ID é obrigatório, porque uma atividade ou um fragmento pode ter
mais de uma lista distinta e selecionável, e todos precisam ser mantidos
no estado salvo.
Outros recursos
RecyclerView
é
usado no app de demonstração Sunflower (link em inglês).