Adeus ListView — Um guia para implementar o RecyclerView
O RecyclerView é uma nova (mas nem tanto) view que veio para substituir o ListView e o GridView. De acordo com sua documentação, trata-se de um widget mais avançado e eficiente, quando comparado aos seus antecessores, e que apresenta diversas simplificações para suportar animações e diferentes disposições de elementos.
Sumário
Uma View mais simples e poderosa
Para oferecer todas estas otimizações, a Google decidiu simplificar o elemento. Pode parecer estranho, mas o RecyclerView possui um nível de responsabilidade menor quando comparado ao ListView. Em teoria, o widgeté apenas um container que encapsula um LayoutManager e um ItemAnimator, e que se comunica com um Adapter, mais precisamente, um RecyclerView.Adapter.
“Renan, não entendi nada!”
Não lhe culpo, vamos por partes.
Inclua a dependência
O RecyclerView foi introduzido junto com o Android Lollipop, entretanto ele é distribuído a partir da biblioteca de suporte, de modo a possibilitar o seu uso em dispositivos já datados, Android 2.1.x em diante.
<pre=”java”> dependencies { … compile ‘com.android.support:recyclerview-v7:22.2.1’ }
LayoutManager
Ao contrário do ListView, o RecyclerView não possui a responsabilidade de posicionar os elementos na lista, e, ao contrário do que o nome indica, ele também não possui a função de reutilizar as views que não estão mais visíveis para o usuário. São os LayoutManagers que apresentam esta função.
Este desacoplamento permite que o RecyclerView seja utilizado para diferentes layouts, como por exemplo para uma lista vertical de itens ou até para a construção de grids.
Atualmente, o componente apresenta três LayoutManagers:
- LinearLayoutManager: para a construção de listas verticais ou horizontais;
- GridLayoutManager: para a construção de Grids;
- StaggeredGridLayoutManager: para a construção de Grids nos quais cada item pode apresentar tamanhos variados, criando uma espécie de mosaico.
Um exemplo de utilização do LinearLayoutManager seria:
<pre lang=”java”>mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
mRecyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);</pre>
Caso seu desejo seja a criação de um Grid, ao invés de uma lista, basta modificar o LayoutManager:https://gist.github.com/relferreira/d5a96c82c4434bba25aa
https://gist.github.com/relferreira/e55ba20a7bbd01c3252f
Importante notar que o construtor do GridLayoutManager apresenta como segundo parâmetro o número de colunas que o Grid possuirá.
RecyclerView.Adapter
Esqueça o ArrayAdapter e/ou BaseAdapter. Caso você utilize o RecyclerView em suas listas, você precisará estender esta classe. Uma grande vantagem deste novo adapter é a obrigatoriedade de se utilizar um ViewHolder. Este é um padrão estimulado pela Google que melhora a performance das listas, uma vez que o mesmo cria um “cache” das views, evitando algumas operações de findViewById(…) que impactam muito a fluidez do scroll. Com o ListView, eram necessários alguns ajustes, ou melhor, algumas gambiarras, para implementar o padrão.
Como o RecyclerView foi concebido tendo em mente a utilização dosViewHolders, o RecyclerView.Adapter demonstra uma implementação mais simples e de fácil entendimento, eliminando um pouco a preocupação do desenvolvedor em tratar casos de reutilização das views de cada item.
De forma geral, você deve implementar três métodos em seu adapter:
- getItemCount: retorna o número de elementos presentes na lista de dados;
- onCreateViewHolder: retorna uma nova instância do viewHolder;
- onBindViewHolder: inclui os dados em cada item da lista.
Para exemplificar, vamos primeiramente criar um adapter que será responsável por uma lista de pessoas, representado pelo Model “Person”.
https://gist.github.com/relferreira/23f4980525635afb1d3d
Logo, implementa-se o ViewHolder, que se trata apenas uma classe estática que apresenta uma referência para as views presentes em cada linha da nossa lista. Importante perceber que, ao contrário do ViewHolder utilizado para as ListViews, o RecyclerView já apresenta uma implementação do padrão, o RecyclerView.ViewHolder, que deve ser herdado para a definição de novos ViewHolders.
https://gist.github.com/relferreira/e859f314e82e6914e550
Por último, atrelamos o adapter ao RecyclerView, presente na Activity ou Fragment:
https://gist.github.com/relferreira/a698b2c19682f09f8c43
ItemAnimator
O ItemAnimator é o responsável por animar qualquer notificação enviada para o Adapter, consequentemente, eventos de remoção e adição de itens da lista podem ser animados, caso se indique para o RecyclerView uma implementação de um ItemAnimator.
Para simplificar, o RecyclerView já provê algumas animações padrões, e para isso, basta substituir o famoso método notifyDataSetChanged do adapter pelos seguintes:
- notifyItemInserted(int position): para indicar a inserção de um novo item na posição indicada;
- notifyItemRemoved(int position): para indicar a remoção de um item presente na posição indicada.
Desta forma, um exemplo de adição de elementos em uma lista poderia ser:
https://gist.github.com/relferreira/c72e1c5d052cfd7dac17
DEMO
Todos os códigos estão disponíveis em: https://github.com/relferreira/recyclerview
Desenvolvimento de Software
Confira outros artigos
Testes end-to-end: sucesso na implementação da automação
Hoje, como você garante a entrega de valor, a confiabilidade e a eficiência do seu projeto? Com o intuito de responder a essa questão crucial, uma das melhores respostas é a automação de testes end-to-end. Muitas pessoas, principalmente nossos clientes, tendem a imaginar que automação de testes é apenas mais um tipo de teste de […]
Desenvolvimento de Software
Mecanismos de Acompanhamento no Desenvolvimento de Software
O uso de mecanismos de acompanhamento é imprescindível no mundo do desenvolvimento de software e pode potencializar a eficiência digital. O acompanhamento efetivo das operações é fundamental para garantir a entrega de soluções digitais de sucesso. Na nossa empresa, utilizamos uma metodologia única, o dti evolve, que incorpora inteligência artificial (IA) para acelerar nosso processo de […]
Desenvolvimento de Software
Eficiência digital com copilot: um caso de uso do GitHub
Em um mundo em constante evolução tecnológica, otimizar o tempo e potencializar a eficiência digital se torna cada vez mais crucial. Portanto, vamos apresentar alguns experimentos que estão sendo implementados com o Git Hub Copilot em busca de maior eficiência digital. Certamente quem nos acompanha sabe que estamos experimentando e introduzindo as melhores ferramentas de […]
Desenvolvimento de Software