0Pricing
Android Academy · Lección

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 change

Pulsación prolongada y menús contextuales

También puede responder a pulsaciones prolongadas estableciendo setOnLongClickListener en onBindViewHolder:

  • Devuelva true desde 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 a holder.itemView.setOnClickListener
  • Navegue a una pantalla de detalles pasando extras mediante Intent
  • Use ListAdapter + DiffUtil para 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

  1. Colecciones de Kotlin
  2. Fundamentos de RecyclerView
  3. Eventos de clic de RecyclerView
  4. SharedPreferences
  5. DataStore Preferences
  6. Adaptadores y DiffUtil
← Volver a Android Academy