0Pricing
Android Academy · Lekcja

Obsługa kliknięć w RecyclerView

Obsługuj kliknięcia elementów i długie naciśnięcia w RecyclerView, przekazuj listenery kliknięć do adapterów i przechodź do ekranu szczegółów po stuknięciu elementu.

Obsługa kliknięć w RecyclerView to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 3 z 6. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 6 lekcji w sumie.

Umożliwianie klikania elementów listy

RecyclerView nie ma wbudowanego detektora kliknięć tak jak ListView. Detektory kliknięć dodaje się wewnątrz adaptera.

Zalecany wzorzec polega na przekazaniu lambdy (callbacku) do konstruktora adaptera. Po kliknięciu elementu adapter wywołuje lambdę z wybranym elementem — Activity obsługuje dalsze działanie.

Adapter z callbackiem kliknięcia

Dodaj parametr lambda onItemClick do adaptera:

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
}

Obsługa kliknięć w Activity

W Activity przekaż lambdę, która przechodzi do ekranu szczegółów:

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)
}

Odbieranie danych na ekranie szczegółów

Odczytaj dodatkowe dane w Activity szczegółów:

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 do wydajnych aktualizacji

Gdy dane listy się zmienią, nie wywołuj notifyDataSetChanged() — spowoduje to ponowne narysowanie wszystkiego. Zamiast tego użyj DiffUtil:

  • Oblicza minimalne różnice między starą a nową listą
  • Animuje tylko zmienione elementy
  • Zapewnia lepszą wydajność i wygodę użytkowania

Nowoczesnym rozwiązaniem jest ListAdapter, który automatycznie korzysta z DiffUtil.

ListAdapter z DiffUtil

Rozszerz ListAdapter, aby automatycznie aktualizować listę z animacją:

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) }
    }
}

Przekazywanie nowych list

W przypadku ListAdapter aktualizuj listę, wywołując submitList(). DiffUtil automatycznie obsłuży animację:

// 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

Długie naciśnięcie i menu kontekstowe

Możesz także reagować na długie naciśnięcia, ustawiając setOnLongClickListener w metodzie onBindViewHolder:

  • Zwróć true z detektora, aby obsłużyć zdarzenie
  • Użyj go do wyświetlenia okna dialogowego usuwania lub edycji
  • Możesz też zaimplementować usuwanie gestem przesunięcia za pomocą ItemTouchHelper

Dodawanie dekoracji elementów

Dodaj wizualne separatory między elementami listy za pomocą DividerItemDecoration:

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

Szybkie sprawdzenie

Jaki jest zalecany sposób obsługi kliknięć elementów w adapterze RecyclerView?

Podsumowanie: kliknięcia w RecyclerView

Potrafisz teraz tworzyć interaktywne listy:

  • Przekazuj callback lambdy do konstruktora adaptera
  • W metodzie onBindViewHolder wywołuj holder.itemView.setOnClickListener
  • Przechodź do ekranu szczegółów, przekazując dodatkowe dane za pomocą Intent
  • Używaj ListAdapter + DiffUtil do płynnych aktualizacji z animacją
  • Wywołuj submitList(), aby aktualizować wyświetlane dane

Dalej: przechowywanie danych lokalnie za pomocą SharedPreferences.

Często zadawane pytania

Czy lekcja „Obsługa kliknięć w RecyclerView” jest bezpłatna?

Tak — pełny tekst „Obsługa kliknięć w RecyclerView” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 6 lekcji w sumie.

Co nauczysz się w „Obsługa kliknięć w RecyclerView”?

Obsługuj kliknięcia elementów i długie naciśnięcia w RecyclerView, przekazuj listenery kliknięć do adapterów i przechodź do ekranu szczegółów po stuknięciu elementu. Ćwiczysz Android Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Android Academy?

Nie wymagamy żadnego doświadczenia. Android Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 6.

Ile czasu zajmuje lekcja „Obsługa kliknięć w RecyclerView”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Android Academy?

Tak. Każda lekcja Android Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Kolekcje w Kotlinie
  2. Podstawy RecyclerView
  3. Obsługa kliknięć w RecyclerView
  4. SharedPreferences
  5. Preferencje DataStore
  6. Adaptery i DiffUtil
← Powrót do Android Academy