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 changeDł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óć
truez 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
onBindViewHolderwywołujholder.itemView.setOnClickListener - Przechodź do ekranu szczegółów, przekazując dodatkowe dane za pomocą Intent
- Używaj
ListAdapter+DiffUtildo 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
- Kolekcje w Kotlinie
- Podstawy RecyclerView
- Obsługa kliknięć w RecyclerView
- SharedPreferences
- Preferencje DataStore
- Adaptery i DiffUtil