Sobes.tech
Middle

Como criar o seu próprio RecyclerView.Adapter para usar numa aplicação Android?

sobes.tech IA

Resposta da IA

  1. Criar uma classe que herde de RecyclerView.Adapter<ViewHolder>. Onde ViewHolder é uma classe interna que herda de RecyclerView.ViewHolder.

  2. Implementar três métodos abstratos:

    • onCreateViewHolder(parent: ViewGroup, viewType: Int): Cria uma nova instância de ViewHolder. Normalmente aqui ocorre o inflar do layout do elemento da lista.
    • onBindViewHolder(holder: ViewHolder, position: Int): Liga os dados aos elementos do ViewHolder para a posição indicada.
    • getItemCount(): Int: Retorna o número total de elementos no conjunto de dados.
  3. Dentro da classe adaptadora, definir uma lista ou outro contêiner para armazenar os dados a serem exibidos.

  4. No método onCreateViewHolder, obter LayoutInflater a partir do contexto de parent, e então chamar inflater.inflate() para criar o elemento View da lista. Passar a View criada ao construtor de ViewHolder.

  5. Dentro da classe interna ViewHolder, obter referências aos elementos View do layout do elemento da lista, com os quais se precisa trabalhar. Isso é feito no construtor de ViewHolder, que recebe a View.

  6. No método onBindViewHolder, usar position para obter o elemento de dados correspondente da coleção. Depois, definir os valores das propriedades dos elementos View em holder com base nos dados desse elemento.

  7. Adicionar métodos para atualizar os dados no adaptador (por exemplo, setData(newData: List<Item>) ou addItem(item: Item)). Após modificar os dados, chamar métodos que informem ao RecyclerView sobre as mudanças, como notifyDataSetChanged() ou métodos mais específicos como notifyItemInserted(), notifyItemRemoved(), notifyItemChanged(), notifyItemRangeChanged().

Exemplo de estrutura:

class MyAdapter(private var dataSet: List<String>) :
    RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val textView: TextView

        init {
            // Definir o listener de clique para a ViewHolder.
            textView = view.findViewById(R.id.textView) // ID de exemplo do layout
        }
    }

    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(viewGroup.context)
            .inflate(R.layout.item_layout, viewGroup, false) // ID de exemplo do layout do elemento
        return MyViewHolder(view)
    }

    override fun onBindViewHolder(viewHolder: MyViewHolder, position: Int) {
        viewHolder.textView.text = dataSet[position]
    }

    override fun getItemCount() = dataSet.size

    fun updateData(newData: List<String>) {
        dataSet = newData
        notifyDataSetChanged() // Ou métodos mais precisos notify*
    }
}
  1. Na atividade ou fragmento onde se usa RecyclerView, criar uma instância deste adaptador e defini-lo para o RecyclerView usando o método setAdapter(). Também não esquecer de definir um LayoutManager para o RecyclerView (por exemplo, LinearLayoutManager).
// Na Activity/Fragment
val recyclerView: RecyclerView = findViewById(R.id.recyclerView) // ID de exemplo
val layoutManager = LinearLayoutManager(this) // Ou outro layout manager
recyclerView.layoutManager = layoutManager
val myAdapter = MyAdapter(initialData)
recyclerView.adapter = myAdapter

// Atualização de dados
myAdapter.updateData(newData)