0Pricing
Android Academy · Aula

Eventos de clique do RecyclerView

Gerencie cliques e pressionamentos longos em itens do RecyclerView, passe ouvintes de clique aos adaptadores e navegue para uma tela de detalhes ao tocar em um item.

Eventos de clique do RecyclerView é uma aula grátis de Android Academy no CoddyKit. Esta é a aula 3 de 6. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Android Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Android Academy inclui 6 aulas no total.

Tornando os itens da lista selecionáveis

O RecyclerView não tem um ouvinte de clique integrado como o ListView. Você adiciona ouvintes de clique dentro do Adapter.

O padrão recomendado é passar uma lambda (retorno de chamada) ao construtor do Adapter. Quando um item é selecionado, o Adapter chama a lambda com o item selecionado — a Activity trata do que acontece em seguida.

Adapter com retorno de chamada de clique

Adicione um parâmetro lambda onItemClick ao Adapter:

class FruitAdapter(
    private val fruits: List<Fruit>,
    private val onItemClick: (Fruit) -> Unit
) : RecyclerView.Adapter<FruitAdapter.ViewHolder>() {

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val tvName: TextView = view.findViewById(R.id.tvName)
        val tvCalories: TextView = view.findViewById(R.id.tvCalories)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_fruit, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val fruit = fruits[position]
        holder.tvName.text = fruit.name
        holder.tvCalories.text = "${fruit.calories} kcal"
        // Set click listener on the whole item
        holder.itemView.setOnClickListener {
            onItemClick(fruit)
        }
    }

    override fun getItemCount() = fruits.size
}

Tratando cliques na Activity

Na Activity, passe uma lambda que navegue até a tela de detalhes:

val adapter = FruitAdapter(fruits) { fruit ->
    // Called when user taps a fruit
    val intent = Intent(this, FruitDetailActivity::class.java)
    intent.putExtra("FRUIT_NAME", fruit.name)
    intent.putExtra("FRUIT_CALORIES", fruit.calories)
    startActivity(intent)
}

binding.recyclerView.apply {
    this.adapter = adapter
    layoutManager = LinearLayoutManager(this@MainActivity)
}

Recebendo dados na tela de detalhes

Leia os extras na Activity de detalhes:

class FruitDetailActivity : AppCompatActivity() {

    private lateinit var binding: ActivityFruitDetailBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityFruitDetailBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val name = intent.getStringExtra("FRUIT_NAME") ?: "Unknown"
        val calories = intent.getIntExtra("FRUIT_CALORIES", 0)

        binding.tvDetailName.text = name
        binding.tvDetailCalories.text = "$calories kcal"
    }
}

DiffUtil para atualizações eficientes

Quando os dados da sua lista mudarem, não chame notifyDataSetChanged() — isso redesenha tudo. Use DiffUtil:

  • Calcula a diferença mínima entre as listas antiga e nova
  • Anima somente os itens alterados
  • Oferece melhor desempenho e experiência do usuário

A forma moderna é usar ListAdapter, que utiliza DiffUtil automaticamente.

ListAdapter com DiffUtil

Estenda ListAdapter para obter atualizações automáticas e animadas da lista:

class FruitAdapter(
    private val onItemClick: (Fruit) -> Unit
) : ListAdapter<Fruit, FruitAdapter.ViewHolder>(DIFF_CALLBACK) {

    companion object {
        val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Fruit>() {
            override fun areItemsTheSame(old: Fruit, new: Fruit) =
                old.name == new.name
            override fun areContentsTheSame(old: Fruit, new: Fruit) =
                old == new  // data class equals()
        }
    }

    // ... ViewHolder and onCreateViewHolder same as before ...

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val fruit = getItem(position)  // use getItem(), not fruits[position]
        holder.tvName.text = fruit.name
        holder.itemView.setOnClickListener { onItemClick(fruit) }
    }
}

Enviando novas listas

Com ListAdapter, atualize a lista chamando submitList(). DiffUtil trata da animação automaticamente:

// In Activity:
val adapter = FruitAdapter { fruit ->
    // handle click
}
binding.recyclerView.adapter = adapter

// Initial data
adapter.submitList(fruits)

// Later, update with new data (e.g. after filtering):
val filtered = fruits.filter { it.calories < 100 }
adapter.submitList(filtered)  // DiffUtil animates the change

Pressão longa e menus de contexto

Você também pode responder a pressões longas definindo setOnLongClickListener em onBindViewHolder:

  • Retorne true do ouvinte para consumir o evento
  • Use-o para mostrar uma caixa de diálogo de exclusão ou edição
  • Ou implemente a exclusão por deslize com ItemTouchHelper

Adicionando decorações aos itens

Adicione uma separação visual entre os itens da lista com DividerItemDecoration:

binding.recyclerView.apply {
    adapter = fruitAdapter
    layoutManager = LinearLayoutManager(this@MainActivity)
    addItemDecoration(
        DividerItemDecoration(
            this@MainActivity,
            DividerItemDecoration.VERTICAL
        )
    )
}

Verificação rápida

Qual é a forma recomendada de tratar cliques em itens em um Adapter do RecyclerView?

Recapitulação: cliques no RecyclerView

Agora você pode criar listas interativas:

  • Passe um retorno de chamada lambda ao construtor do Adapter
  • Em onBindViewHolder, chame holder.itemView.setOnClickListener
  • Navegue até uma tela de detalhes passando extras por meio de Intent
  • Use ListAdapter + DiffUtil para obter atualizações suaves e animadas
  • Chame submitList() para atualizar os dados exibidos

A seguir: mantenha os dados localmente com SharedPreferences.

Perguntas Frequentes

A aula “Eventos de clique do RecyclerView” é grátis?

Sim — o texto completo de “Eventos de clique do RecyclerView” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Android Academy, atualize para CoddyKit PRO. O curso de Android Academy inclui 6 aulas no total.

O que vou aprender em “Eventos de clique do RecyclerView”?

Gerencie cliques e pressionamentos longos em itens do RecyclerView, passe ouvintes de clique aos adaptadores e navegue para uma tela de detalhes ao tocar em um item. Você pratica Android Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Android Academy?

Nenhuma experiência prévia é necessária. Android Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 6.

Quanto tempo leva a aula “Eventos de clique do RecyclerView”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Android Academy?

Sim. Cada aula de Android Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Coleções do Kotlin
  2. Noções Básicas de RecyclerView
  3. Eventos de clique do RecyclerView
  4. SharedPreferences
  5. Preferências do DataStore
  6. Adaptadores e DiffUtil
← Voltar para Android Academy