RecyclerExibir partes e funcionalidades
RecyclerView
manipula algumas tarefas internamente (como rolagem e reciclagem de exibições), mas é essencialmente um gerente que coordena classes auxiliares para exibir uma coleção.
RecyclerView
delega tarefas para as seguintes classes auxiliares:
Adapter
– Infla layouts de item (instancia o conteúdo de um arquivo de layout) e associa dados a exibições exibidas em umRecyclerView
. O adaptador também relata eventos de clique em item.LayoutManager
– Mede e posiciona exibições de itens dentro de umRecyclerView
e gerencia a política de reciclagem de exibição.ViewHolder
– Pesquisa e armazena referências de exibição. O titular da exibição também ajuda a detectar cliques de exibição de item.ItemDecoration
– Permite que um aplicativo adicione deslocamentos especiais de desenho e layout a modos de exibição específicos para divisores de desenho entre itens, realces e limites de agrupamento visual.ItemAnimator
– Define as animações que ocorrem durante as ações do item ou conforme as alterações são feitas no adaptador.
A relação entre as RecyclerView
classes , LayoutManager
e Adapter
é descrita no diagrama a seguir:
Como ilustra essa figura, o LayoutManager
pode ser considerado como o intermediário entre o Adapter
e o RecyclerView
. O LayoutManager
faz chamadas em Adapter
métodos em nome do RecyclerView
. Por exemplo, o LayoutManager
chama um Adapter
método quando é hora de criar uma nova exibição para uma posição de item específica no RecyclerView
. O Adapter
infla o layout desse item e cria uma ViewHolder
instância (não mostrada) para armazenar em cache as referências às exibições nessa posição. Quando o LayoutManager
chama para Adapter
associar um item específico ao conjunto de dados, o Adapter
localiza os dados desse item, recupera-os do conjunto de dados e copia-os para a exibição de item associada.
Ao usar RecyclerView
em seu aplicativo, é necessário criar tipos derivados das seguintes classes:
RecyclerView.Adapter
– Fornece uma associação do conjunto de dados do aplicativo (que é específico para seu aplicativo) para exibições de item exibidas dentro doRecyclerView
. O adaptador sabe como associar cada posição de exibição de item noRecyclerView
a um local específico na fonte de dados. Além disso, o adaptador manipula o layout do conteúdo em cada exibição de item individual e cria o titular da exibição para cada exibição. O adaptador também relata eventos de clique em item detectados pelo modo de exibição de item.RecyclerView.ViewHolder
– Armazena em cache referências aos modos de exibição no arquivo de layout de item para que as pesquisas de recursos não sejam repetidas desnecessariamente. O titular do modo de exibição também organiza eventos de clique em item a serem encaminhados para o adaptador quando um usuário toca no modo de exibição de item associado do titular do modo de exibição.RecyclerView.LayoutManager
– Posiciona itens dentro doRecyclerView
. Você pode usar um dos vários gerenciadores de layout predefinidos ou implementar seu próprio gerenciador de layout personalizado.RecyclerView
delega a política de layout ao gerenciador de layout, para que você possa conectar um gerenciador de layout diferente sem precisar fazer alterações significativas em seu aplicativo.
Além disso, opcionalmente, você pode estender as seguintes classes para alterar a aparência de RecyclerView
em seu aplicativo:
RecyclerView.ItemDecoration
RecyclerView.ItemAnimator
Se você não estender ItemDecoration
e ItemAnimator
, RecyclerView
usará implementações padrão. Este guia não explica como criar classes e personalizadasItemDecoration
. Para obter mais informações sobre essas classes, consulte RecyclerView.ItemDecoration e RecyclerView.ItemAnimator.ItemAnimator
Como funciona a reciclagem de exibição
RecyclerView
não aloca uma exibição de item para cada item em sua fonte de dados. Em vez disso, ele aloca apenas o número de exibições de item que cabem na tela e reutiliza esses layouts de item à medida que o usuário rola. Quando a exibição sai da vista pela primeira vez, ela passa pelo processo de reciclagem ilustrado na figura a seguir:
Quando uma exibição rola para fora da vista e não é mais exibida, ela se torna uma exibição de recorte.
O modo de exibição de recorte é colocado em um pool e se torna uma exibição de reciclagem. Esse pool é um cache de exibições que exibem o mesmo tipo de dados.
Quando um novo item deve ser exibido, uma exibição é retirada do pool de reciclagem para reutilização. Como essa exibição deve ser vinculada novamente pelo adaptador antes de ser exibida, ela é chamada de exibição sujo.
A exibição sujo é reciclada: o adaptador localiza os dados do próximo item a ser exibido e copia esses dados para as exibições deste item. As referências para essas exibições são recuperadas do titular da exibição associado à exibição reciclada.
A exibição reciclada é adicionada à lista de itens no
RecyclerView
que estão prestes a entrar na tela.A exibição reciclada fica na tela enquanto o usuário rola o
RecyclerView
para o próximo item na lista. Enquanto isso, outra exibição rola para fora da vista e é reciclada de acordo com as etapas acima.
Além da reutilização de exibição de item, RecyclerView
também usa outra otimização de eficiência: portadores de exibição. Um titular de exibição é uma classe simples que armazena em cache referências de exibição. Sempre que o adaptador infla um arquivo de layout de item, ele também cria um suporte de exibição correspondente. O titular do modo de exibição usa FindViewById
para obter referências aos modos de exibição dentro do arquivo de layout de item inflado. Essas referências são usadas para carregar novos dados nas exibições sempre que o layout é reciclado para mostrar novos dados.
O Gerenciador de Layout
O gerenciador de layout é responsável por posicionar itens na RecyclerView
exibição; ele determina o tipo de apresentação (uma lista ou uma grade), a orientação (se os itens são exibidos vertical ou horizontalmente) e quais itens de direção devem ser exibidos (em ordem normal ou em ordem inversa). O gerenciador de layout também é responsável por calcular o tamanho e a posição de cada item na exibição RecycleView .
O gerenciador de layout tem uma finalidade adicional: determina a política de quando reciclar exibições de item que não estão mais visíveis para o usuário. Como o gerenciador de layout está ciente de quais modos de exibição estão visíveis (e quais não estão), ele está na melhor posição para decidir quando uma exibição pode ser reciclada. Para reciclar uma exibição, o gerenciador de layout normalmente faz chamadas ao adaptador para substituir o conteúdo de uma exibição reciclada por dados diferentes, conforme descrito anteriormente em Como funciona a reciclagem de exibição.
Você pode estender RecyclerView.LayoutManager
para criar seu próprio gerenciador de layout ou usar um gerenciador de layout predefinido.
RecyclerView
fornece os seguintes gerenciadores de layout predefinidos:
LinearLayoutManager
– Organiza itens em uma coluna que podem ser rolados verticalmente ou em uma linha que pode ser rolada horizontalmente.GridLayoutManager
– Exibe itens em uma grade.StaggeredGridLayoutManager
– Exibe itens em uma grade escalonada, em que alguns itens têm alturas e larguras diferentes.
Para especificar o gerenciador de layout, crie uma instância do gerenciador de layout escolhido e passe-o para o SetLayoutManager
método . Observe que você deve especificar o gerenciador de layout – RecyclerView
não seleciona um gerenciador de layout predefinido por padrão.
Para obter mais informações sobre o gerenciador de layout, consulte a referência da classe RecyclerView.LayoutManager.
O Titular do Modo de Exibição
O titular da exibição é uma classe que você define para referências de exibição de cache. O adaptador usa essas referências de exibição para associar cada exibição ao seu conteúdo. Cada item no tem uma instância de titular de RecyclerView
exibição associada que armazena em cache as referências de exibição para esse item. Para criar um titular de exibição, use as seguintes etapas para definir uma classe para manter o conjunto exato de exibições por item:
- Subclasse
RecyclerView.ViewHolder
. - Implemente um construtor que procure e armazene as referências de exibição.
- Implemente as propriedades que o adaptador pode usar para acessar essas referências.
Um exemplo detalhado de uma ViewHolder
implementação é apresentado em Um exemplo de RecyclerView básico.
Para obter mais informações sobre RecyclerView.ViewHolder
, consulte a referência da classe RecyclerView.ViewHolder.
O adaptador
A maior parte do "trabalho pesado" do RecyclerView
código de integração ocorre no adaptador.
RecyclerView
exige que você forneça um adaptador derivado de RecyclerView.Adapter
para acessar sua fonte de dados e preencher cada item com conteúdo da fonte de dados.
Como a fonte de dados é específica do aplicativo, você deve implementar a funcionalidade do adaptador que entenda como acessar seus dados. O adaptador extrai informações da fonte de dados e as carrega em cada item da RecyclerView
coleção.
O desenho a seguir ilustra como o adaptador mapeia o conteúdo em uma fonte de dados por meio de portadores de exibição para exibições individuais dentro de cada item de linha no RecyclerView
:
O adaptador carrega cada RecyclerView
linha com dados para um item de linha específico. Para a posição da linha P, por exemplo, o adaptador localiza os dados associados na posição P na fonte de dados e copia esses dados para o item de linha na posição P da RecyclerView
coleção.
No desenho acima, por exemplo, o adaptador usa o suporte de exibição para pesquisar as referências para o ImageView
e TextView
nessa posição para que ele não precise chamar FindViewById
repetidamente para esses modos de exibição à medida que o usuário rola pela coleção e reutiliza as exibições.
Ao implementar um adaptador, você deve substituir os seguintes RecyclerView.Adapter
métodos:
OnCreateViewHolder
– Cria uma instância do arquivo de layout do item e do titular da exibição.OnBindViewHolder
– Carrega os dados na posição especificada nas exibições cujas referências são armazenadas no titular da exibição especificado.ItemCount
– retorna o número de itens na fonte de dados.
O gerenciador de layout chama esses métodos enquanto ele está posicionando itens dentro do RecyclerView
.
Notificando o RecyclerView sobre alterações de dados
RecyclerView
não atualiza automaticamente sua exibição quando o conteúdo de sua fonte de dados é alterado; o adaptador deve notificar RecyclerView
quando há uma alteração no conjunto de dados. O conjunto de dados pode ser alterado de várias maneiras; por exemplo, o conteúdo dentro de um item pode ser alterado ou a estrutura geral dos dados pode ser alterada.
RecyclerView.Adapter
fornece uma série de métodos que você pode chamar para que RecyclerView
responda às alterações de dados da maneira mais eficiente:
NotifyItemChanged
– Sinaliza que o item na posição especificada foi alterado.NotifyItemRangeChanged
– Sinaliza que os itens no intervalo de posições especificado foram alterados.NotifyItemInserted
– Sinaliza que o item na posição especificada foi inserido recentemente.NotifyItemRangeInserted
– Sinaliza que os itens no intervalo de posições especificado foram inseridos recentemente.NotifyItemRemoved
– Sinaliza que o item na posição especificada foi removido.NotifyItemRangeRemoved
– Sinaliza que os itens no intervalo de posições especificado foram removidos.NotifyDataSetChanged
– Sinaliza que o conjunto de dados foi alterado (força uma atualização completa).
Se você souber exatamente como o conjunto de dados foi alterado, poderá chamar os métodos apropriados acima para atualizar RecyclerView
da maneira mais eficiente. Se você não souber exatamente como o conjunto de dados foi alterado, poderá chamar NotifyDataSetChanged
, o que é muito menos eficiente porque RecyclerView
deve atualizar todas as exibições visíveis para o usuário. Para obter mais informações sobre esses métodos, consulte RecyclerView.Adapter.
No próximo tópico, Um Exemplo de RecyclerView Básico, um aplicativo de exemplo é implementado para demonstrar exemplos de código reais das partes e da funcionalidade descritas acima.