O que é um RecyclerView e como utiliza-lo?
Published: 2023-05-06 15:48:58

Me chamo Gabriel Levindo, moro em Saquarema, Rio de Janeiro, tenho 22 anos e estou cursando Sistemas da Informação na universidade Estácio de Sá. Há mais ou menos 3 meses comecei a estudar programação android mais a fundo e fiz meu primeiro App em apenas 10 dias, mas seguindo nos estudos me deparei com um desafio que foi fazer uma tela de lista com o RecyclerView. 

Mas, o que é um RecyclerView?
Abaixo temos uma lista de tarefas que permite que adicione, atualize e exclua as tarefas de forma simples e tem vários elementos;


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ljzmeon7khhsr2ra962q.jpg)

Bora implementar juntos?

Inicialmente me vi perdido com quais componentes utilizar e refiz pelo menos umas 4 vezes para conseguir pegar um pouco das suas funcionalidades, por esse motivo estou escrevendo esse artigo para além de internalizar melhor meu conhecimento, pretendo ajudar as pessoas que se encontram com dificuldades, a entenderem melhor sobre o RecyclerView. Se você gostar do meu artigo, compartilhe para ajudar outras pessoas também.


Nesse artigo vou te explicar sobre a implementação do RecyclerView e ao final dessa leitura você vai enteder sobre: 
•	RecyclerView UI;
•	RecyclerView Adapter;
•	ViewHolder;
•	LayoutManager.

RecyclerView:
   O RecyclerView é uma classe do Android que permite exibir grandes conjuntos de dados em uma lista ou grade rolável, otimizando o desempenho e a eficiência de memória. É uma evolução do ListView e GridView, mais flexível e customizável. Além disso,  é composto por três principais componentes: ViewHolder, Adapter e LayoutManager.
ViewHolder:
  Cria e gerencia as visualizações individuais da lista, definindo e mantendo as referências aos elementos visuais, de um item da lista para atualização dinâmica.
Adapter:
  Fornece dados para a RecyclerView, cria ViewHolders para cada item da lista e vincula os dados.
LayoutManager:
  Organiza os itens da lista, determinando como cada item é exibido e posicionado. O RecyclerView possui vários LayoutManagers embutidos, como LinearLayoutManager, GridLayoutManager e StaggeredGridLayoutManager.
  O RecyclerView suporta animações para adição, remoção e movimento de itens (gestos). É possível personalizar a aparência dos itens da lista com layouts personalizados, para cada item. É ótimo para exibir grandes conjuntos de dados, em uma lista rolável, oferecendo melhor eficiência e desempenho em relação ao ListView. Para implementar o RecyclerView, é necessário ter um arquivo XML na pasta res/layout.

```
   <androidx.recyclerview.widget.RecyclerView

        android:id="@+id/rv_task_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
  app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
 tools:listitem="@layout/item_task" />
```
Dessa forma, conseguimos ter o nosso RecyclerView e, a partir daí, temos que criar o nosso adaptador. Para criarmos o adaptador, temos três métodos principais que precisamos utilizar, são eles:  onCreateViewHolder, onBindViewHolder e getItemCount.
onCreateViewHolder: Sua principal responsabilidade  é inflar o layout do item da lista, e criar um novo ViewHolder para ele. O RecyclerView chama esse método quando precisa criar um novo ViewHolder, para exibir um item na lista.
onBindViewHolder: Sua principal responsabilidade é associar os dados aos elementos visuais do item da lista no ViewHolder. O RecyclerView chama esse método quando precisa atualizar um ViewHolder existente com novos dados.
getItemCount: É um método utilizado para determinar quantos itens serão exibidos na lista. Ele retorna o número total de itens que estão na lista. É importante para o RecyclerView saber o número de itens para exibi-los corretamente na tela. Em resumo, o getItemCount informa ao RecyclerView o tamanho da lista que ele está exibindo.
Além disso, precisamos utilizar a função bind, que é responsável por atualizar a exibição de um item do RecyclerView com os dados fornecidos. Normalmente, é implementada na classe do adaptador e recebe como parâmetro um objeto que representa a exibição do item na lista. Como exemplo, em uma lista de contatos, a função bind poderia atualizar os campos de texto na exibição do item ou as informações do contato correspondente.
Para implementar o adaptador (Adapter), precisamos criar uma classe e utilizá-la da seguinte forma:

```
//Aqui Criamos o Adaptador, passando o RecyclerView
class TaskListAdapter(

    private val openTaskDetailView:(task:Task) -> Unit
    ) :
    ListAdapter<Task,TaskListViewHolder>(TaskListAdapter){
    private var listTask: List<Task> = emptyList()
//Aqui seria o método OnCreateViewHolder.
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TaskListViewHolder {
        val view: View = LayoutInflater
            .from(parent.context)
            .inflate(R.layout.item_task, parent, false)
        return TaskListViewHolder(view)
    }
//Aqui seria o método onBindViewHolder.
    override fun onBindViewHolder(holder: TaskListViewHolder, position: Int) {
        val task = getItem(position)
        holder.bind(task, openTaskDetailView)
    }
}
}

//Aqui seria o ViewHolder do adaptador.
class TaskListViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {

    private val tvTaskTitle = view.findViewById<TextView>(R.id.tv_task_title)
    private val tvTaskDescription = view.findViewById<TextView>(R.id.tv_task_description)
//Aqui seria o Bind do adaptador
    fun bind(task: Task, openTaskDetailView:(task:Task) -> Unit) {

        tvTaskTitle.text = task.title
        tvTaskDescription.text = task.description
}
}
}
```

Pontos positivos para a utilização do RecyclerView:
1 - Eficiência de desempenho: o RecyclerView é otimizado para lidar com grandes conjuntos de dados, tornando-o mais eficiente em termos de uso de memória e desempenho;
2 - Flexibilidade: o RecyclerView oferece flexibilidade para personalizar a aparência e o comportamento da lista de acordo com as necessidades do desenvolvedor;
3 - Suporte para diferentes tipos de layout: o RecyclerView suporta diferentes tipos de layout, como listas horizontais e verticais, permitindo criar diversas interfaces para o usuário;
4 - Funcionalidades de animação: o RecyclerView oferece funcionalidades de animação, como adicionar ou remover itens da lista de forma animada, melhorando a experiência do usuário ao utilizar a aplicação.
Com o RecyclerView e todas suas implementações, você consegue melhorar o desempenho do seu aplicativo e ter flexibilidade de personalização. Por tanto, ele é recomendado para mostrar listas e grandes conjuntos de dados. Também oferece suporte para diferentes tipos de layouts e funcionalidades de animação, tornando assim a experiência do usuário a melhor possível. Em suma, o RecyclerView é uma ferramenta importante para desenvolvedores Android que desejam criar interfaces de usuário eficientes e personalizáveis.

Link da documentação do RecyclerView:
https://developer.android.com/guide/topics/ui/layout/recyclerview?hl=pt-br