Eventos de clic de RecyclerView
Gestione los clics y las pulsaciones prolongadas en RecyclerView, pase listeners de clic a los adaptadores y navegue a una pantalla de detalles al tocar un elemento.
Eventos de clic de RecyclerView es una lección gratuita de Android Academy en CoddyKit. Esta es la lección 3 de 6. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Android Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Android Academy incluye 6 lecciones en total.
Hacer que los elementos de la lista respondan a toques
RecyclerView no tiene un listener de clic integrado como lo tenía ListView. Debe añadir los listeners de clic dentro del Adapter.
El patrón recomendado es pasar una lambda (callback) al constructor del Adapter. Cuando se pulsa un elemento, el Adapter llama a la lambda con el elemento seleccionado; la Activity gestiona lo que ocurre después.
Adapter con callback de clic
Añada un parámetro lambda onItemClick al 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
}Gestionar clics en la Activity
En la Activity, pase una lambda que navegue a la pantalla de detalles:
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)
}Recibir datos en la pantalla de detalles
Lea los extras en la Activity de detalles:
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 actualizaciones eficientes
Cuando cambien los datos de la lista, no llame a notifyDataSetChanged(), ya que vuelve a dibujarlo todo. Use DiffUtil en su lugar:
- Calcula la diferencia mínima entre las listas antigua y nueva
- Anima únicamente los elementos modificados
- Ofrece un mejor rendimiento y una mejor experiencia de usuario
La forma moderna es ListAdapter, que usa DiffUtil automáticamente.
ListAdapter con DiffUtil
Extienda ListAdapter para actualizar las listas automáticamente y con animaciones:
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) }
}
}Enviar listas nuevas
Con ListAdapter, actualice la lista llamando a submitList(). DiffUtil gestiona la animación automáticamente:
// 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 changePulsación prolongada y menús contextuales
También puede responder a pulsaciones prolongadas estableciendo setOnLongClickListener en onBindViewHolder:
- Devuelva
truedesde el listener para consumir el evento - Úselo para mostrar un cuadro de diálogo de eliminación o edición
- O implemente la eliminación mediante deslizamiento con
ItemTouchHelper
Añadir decoraciones a los elementos
Añada una separación visual entre los elementos de la lista con DividerItemDecoration:
binding.recyclerView.apply {
adapter = fruitAdapter
layoutManager = LinearLayoutManager(this@MainActivity)
addItemDecoration(
DividerItemDecoration(
this@MainActivity,
DividerItemDecoration.VERTICAL
)
)
}Comprobación rápida
¿Cuál es la forma recomendada de gestionar los clics en los elementos de un Adapter de RecyclerView?
Resumen: clics en RecyclerView
Ahora puede crear listas interactivas:
- Pase un callback lambda al constructor del Adapter
- En
onBindViewHolder, llame aholder.itemView.setOnClickListener - Navegue a una pantalla de detalles pasando extras mediante Intent
- Use
ListAdapter+DiffUtilpara obtener actualizaciones fluidas y animadas - Llame a
submitList()para actualizar los datos mostrados
Siguiente: conservar datos localmente con SharedPreferences.
Preguntas frecuentes
¿La lección «Eventos de clic de RecyclerView» es gratis?
Sí — el texto completo de «Eventos de clic de RecyclerView» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Android Academy, actualiza a CoddyKit PRO. El curso de Android Academy incluye 6 lecciones en total.
¿Qué aprenderé en «Eventos de clic de RecyclerView»?
Gestione los clics y las pulsaciones prolongadas en RecyclerView, pase listeners de clic a los adaptadores y navegue a una pantalla de detalles al tocar un elemento. Practicas Android Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Android Academy?
No se requiere experiencia previa. Android Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 6.
¿Cuánto tiempo toma la lección «Eventos de clic de RecyclerView»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Android Academy?
Sí. Cada lección de Android Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Colecciones de Kotlin
- Fundamentos de RecyclerView
- Eventos de clic de RecyclerView
- SharedPreferences
- DataStore Preferences
- Adaptadores y DiffUtil