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 changePressão longa e menus de contexto
Você também pode responder a pressões longas definindo setOnLongClickListener em onBindViewHolder:
- Retorne
truedo 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, chameholder.itemView.setOnClickListener - Navegue até uma tela de detalhes passando extras por meio de Intent
- Use
ListAdapter+DiffUtilpara 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
- Coleções do Kotlin
- Noções Básicas de RecyclerView
- Eventos de clique do RecyclerView
- SharedPreferences
- Preferências do DataStore
- Adaptadores e DiffUtil