Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Menyesuaikan daftar dinamis
Bagian dari Android Jetpack.
Coba cara Compose
Jetpack Compose adalah toolkit UI yang direkomendasikan untuk Android. Pelajari cara bekerja dengan tata letak di Compose.
Anda dapat menyesuaikan objek
RecyclerView
untuk memenuhi kebutuhan spesifik Anda. Class standar yang dijelaskan dalam
Membuat daftar dinamis dengan
RecyclerView menyediakan semua fungsi yang diperlukan sebagian besar developer. Dalam
banyak kasus, Anda hanya perlu mendesain tampilan untuk setiap penampung tampilan dan menulis
kode untuk memperbarui tampilan tersebut dengan data yang sesuai. Namun, jika aplikasi Anda memiliki
persyaratan khusus, Anda dapat mengubah perilaku standar ini melalui beberapa cara.
Dokumen ini menjelaskan beberapa kemungkinan penyesuaian.
Mengubah tata letak
RecyclerView
menggunakan pengelola tata letak untuk memosisikan setiap item di layar dan untuk menentukan kapan tampilan item yang tidak lagi terlihat oleh pengguna akan digunakan kembali. Untuk menggunakan kembali—atau mendaur ulang—tampilan, pengelola tata letak dapat meminta adaptor untuk mengganti konten tampilan dengan elemen lain dari set data. Mendaur ulang tampilan dengan cara ini meningkatkan
performa dengan menghindari pembuatan tampilan yang tidak perlu atau melakukan
pencarian
findViewById()
yang menghabiskan banyak resource. Android Support Library menyertakan tiga pengelola tata letak standar,
yang masing-masing menawarkan banyak opsi penyesuaian:
LinearLayoutManager
:
menyusun item dalam daftar satu dimensi. Penggunaan
RecyclerView
dengan LinearLayoutManager
menyediakan
fungsi seperti tata letak
ListView
.
GridLayoutManager
:
menyusun item dalam petak dua dimensi, seperti persegi di papan catur. Penggunaan RecyclerView
dengan
GridLayoutManager
menyediakan fungsi seperti tata letak
GridView
.
StaggeredGridLayoutManager
:
menyusun item dalam petak dua dimensi, di mana setiap kolom sedikit di-offset
dari kolom sebelumnya, seperti bintang dalam bendera Amerika.
Jika pengelola tata letak ini tidak sesuai dengan kebutuhan Anda, Anda dapat membuatnya sendiri dengan
memperluas
class abstrak RecyclerView.LayoutManager
.
Menambahkan animasi item
Setiap kali item berubah, RecyclerView
menggunakan animator
untuk mengubah penampilannya. Animator ini adalah objek yang memperluas class
RecyclerView.ItemAnimator
abstrak. Secara default, RecyclerView
menggunakan
DefaultItemAnimator
untuk menyediakan animasi. Jika ingin memberikan animasi kustom, Anda dapat
menentukan objek animator sendiri dengan memperluas
RecyclerView.ItemAnimator
.
Mengaktifkan pilihan item daftar
Library
recyclerview-selection
memungkinkan pengguna memilih item dalam daftar RecyclerView
menggunakan input sentuh
atau mouse. Hal ini memungkinkan Anda mempertahankan kontrol atas presentasi visual item yang dipilih. Anda juga dapat mempertahankan kontrol atas kebijakan yang mengontrol perilaku pemilihan, seperti item yang memenuhi syarat untuk dipilih dan berapa banyak item yang dapat dipilih.
Untuk menambahkan dukungan pemilihan ke instance RecyclerView
, ikuti
langkah-langkah berikut:
- Tentukan jenis kunci pemilihan yang akan digunakan, lalu buat
ItemKeyProvider
.
Ada tiga jenis utama yang dapat Anda gunakan untuk mengidentifikasi item yang dipilih:
Untuk informasi mendetail tentang jenis kunci pemilihan, lihat
SelectionTracker.Builder
.
- Menerapkan
ItemDetailsLookup
.
ItemDetailsLookup
memungkinkan library pemilihan mengakses
informasi tentang item RecyclerView
dengan memperhitungkan
MotionEvent
.
Secara efektif, ini adalah factory untuk instance
ItemDetails
yang ditunjang oleh, atau diekstrak dari, instance
RecyclerView.ViewHolder
.
- Perbarui objek
item
View
di
RecyclerView
untuk menunjukkan apakah pengguna memilih atau
membatalkan pilihannya.
Library pemilihan tidak menyediakan dekorasi visual default untuk
item yang dipilih. Berikan ini saat Anda mengimplementasikan
onBindViewHolder()
.
Sebaiknya gunakan pendekatan berikut:
- Di
onBindViewHolder()
, panggil
setActivated()
—bukan
setSelected()
—pada
objek View
dengan
true
atau false
, bergantung pada apakah item
dipilih.
- Perbarui gaya tampilan untuk menunjukkan status yang diaktifkan. Sebaiknya gunakan resource daftar status warna untuk mengonfigurasi gaya.
- Gunakan
ActionMode
untuk memberikan alat kepada pengguna untuk melakukan tindakan atas pilihan.
Daftarkan
SelectionTracker.SelectionObserver
untuk menerima pemberitahuan saat pilihan berubah. Saat pilihan dibuat untuk pertama kalinya,
jalankan ActionMode
untuk menunjukkannya kepada pengguna dan menyediakan
tindakan untuk pilihan tertentu. Misalnya, Anda dapat menambahkan tombol hapus ke
panel ActionMode
dan menghubungkan panah mundur di panel tersebut untuk menghapus
pilihan. Saat pilihan kosong—jika pengguna menghapus pilihan terakhir kali—hentikan mode tindakan.
- Lakukan tindakan sekunder apa pun yang diperlukan.
Di akhir pipeline pemrosesan peristiwa, library ini dapat menentukan
bahwa pengguna mencoba mengaktifkan item, dengan mengetuknya, atau
mencoba menarik item atau serangkaian item yang dipilih. Respons interpretasi
ini dengan mendaftarkan pemroses yang sesuai. Untuk informasi
selengkapnya, lihat
SelectionTracker.Builder
.
- Rangkai semuanya dengan
SelectionTracker.Builder
.
Contoh berikut menunjukkan cara menyatukan langkah-langkah di atas:
Kotlin
var tracker = SelectionTracker.Builder(
"my-selection-id",
recyclerView,
StableIdKeyProvider(recyclerView),
MyDetailsLookup(recyclerView),
StorageStrategy.createLongStorage())
.withOnItemActivatedListener(myItemActivatedListener)
.build()
Java
SelectionTracker tracker = new SelectionTracker.Builder<>(
"my-selection-id",
recyclerView,
new StableIdKeyProvider(recyclerView),
new MyDetailsLookup(recyclerView),
StorageStrategy.createLongStorage())
.withOnItemActivatedListener(myItemActivatedListener)
.build();
Untuk membuat instance
SelectionTracker
, aplikasi Anda harus menyediakan
RecyclerView.Adapter
yang sama dengan yang Anda gunakan untuk menginisialisasi RecyclerView
ke
SelectionTracker.Builder
. Oleh karena itu, setelah membuat instance
SelectionTracker
, masukkan instance tersebut ke
RecyclerView.Adapter
Anda. Jika tidak, Anda tidak dapat memeriksa status item yang dipilih dari metode onBindViewHolder()
.
- Sertakan pilihan dalam peristiwa
siklus
proses aktivitas.
Agar status pemilihan bertahan di sepanjang peristiwa siklus proses aktivitas, aplikasi Anda
harus memanggil metode
onSaveInstanceState()
dan
onRestoreInstanceState()
di pelacak pilihan dari metode
onSaveInstanceState()
dan
onRestoreInstanceState()
aktivitas. Aplikasi Anda juga harus memasukkan ID pemilihan unik ke konstruktor
SelectionTracker.Builder
. ID ini diperlukan karena
aktivitas atau fragmen mungkin memiliki lebih dari satu daftar unik yang dapat dipilih,
yang semuanya harus dipertahankan dalam status tersimpannya.
Referensi lainnya
Lihat referensi berikut untuk mengetahui informasi tambahan.
Konten dan contoh kode di halaman ini tunduk kepada lisensi yang dijelaskan dalam Lisensi Konten. Java dan OpenJDK adalah merek dagang atau merek dagang terdaftar dari Oracle dan/atau afiliasinya.
Terakhir diperbarui pada 2025-08-21 UTC.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Informasi yang saya butuhkan tidak ada","missingTheInformationINeed","thumb-down"],["Terlalu rumit/langkahnya terlalu banyak","tooComplicatedTooManySteps","thumb-down"],["Sudah usang","outOfDate","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Masalah kode / contoh","samplesCodeIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2025-08-21 UTC."],[],[],null,["# Customize a dynamic list\nPart of [Android Jetpack](/jetpack).\n=============================================================\n\nTry the Compose way \nJetpack Compose is the recommended UI toolkit for Android. Learn how to work with layouts in Compose. \n[Lazy Lists and Grids →](/jetpack/compose/lists#lazy) \n\nYou can customize\n[RecyclerView](/reference/androidx/recyclerview/widget/RecyclerView)\nobjects to meet your specific needs. The standard classes described in\n[Create dynamic lists with\nRecyclerView](/guide/topics/ui/layout/recyclerview) provide all the functionality that most developers need. In\nmany cases, you only need to design the view for each view holder and write the\ncode to update those views with the appropriate data. However, if your app has\nspecific requirements, you can modify the standard behavior in a number of ways.\nThis document describes some of the possible customizations.\n\nModify the layout\n-----------------\n\n`RecyclerView` uses a layout manager to position the individual\nitems on the screen and to determine when to reuse item views that are no longer\nvisible to the user. To reuse---or *recycle* ---a view, a layout\nmanager might ask the adapter to replace the contents of the view with a\ndifferent element from the dataset. Recycling views this way improves\nperformance by avoiding the creation of unnecessary views or performing\nexpensive\n[findViewById()](/reference/android/app/Activity#findViewById(int))\nlookups. The Android Support Library includes three standard layout managers,\nach of which offers many customization options:\n\n- [LinearLayoutManager](/reference/androidx/recyclerview/widget/LinearLayoutManager): arranges the items in a one-dimensional list. Using a `RecyclerView` with `LinearLayoutManager` provides functionality like a [ListView](/reference/android/widget/ListView) layout.\n- [GridLayoutManager](/reference/androidx/recyclerview/widget/GridLayoutManager): arranges the items in a two-dimensional grid, like the squares on a checkerboard. Using a `RecyclerView` with `GridLayoutManager` provides functionality like a [GridView](/reference/android/widget/GridView) layout.\n- [StaggeredGridLayoutManager](/reference/androidx/recyclerview/widget/StaggeredGridLayoutManager): arranges the items in a two-dimensional grid, with each column slightly offset from the one before, like the stars on an American flag.\n\nIf these layout managers don't suit your needs, you can create your own by\nextending the\n[RecyclerView.LayoutManager](/reference/androidx/recyclerview/widget/RecyclerView.LayoutManager)\nabstract class.\n\nAdd item animations\n-------------------\n\nWhenever an item changes, `RecyclerView` uses an *animator*\nto change its appearance. This animator is an object that extends the abstract\n[RecyclerView.ItemAnimator](/reference/androidx/recyclerview/widget/RecyclerView.ItemAnimator)\nclass. By default, the `RecyclerView` uses\n[DefaultItemAnimator](/reference/androidx/recyclerview/widget/DefaultItemAnimator)\nto provide the animation. If you want to provide custom animations, you can\ndefine your own animator object by extending\n`RecyclerView.ItemAnimator`.\n\nEnable list-item selection\n--------------------------\n\nThe\n[`recyclerview-selection`](/reference/androidx/recyclerview/selection/package-summary)\nlibrary lets users select items in a `RecyclerView` list using touch\nor mouse input. This lets you retain control over the visual presentation of a\nselected item. You can also retain control over policies controlling selection\nbehavior, such as which items are eligible for selection and how many items can\nbe selected.\n\nTo add selection support to a `RecyclerView` instance, follow\nthese steps:\n\n1. Determine which selection key type to use, then build an [`ItemKeyProvider`](/reference/androidx/recyclerview/selection/ItemKeyProvider).\n\n There are three key types you can use to identify selected items:\n - [Parcelable](/reference/android/os/Parcelable) and its subclasses, like [Uri](/reference/android/net/Uri)\n - [String](/reference/java/lang/String)\n - [Long](/reference/java/lang/Long)\n\n For detailed information about selection-key types, see\n [SelectionTracker.Builder](/reference/androidx/recyclerview/selection/SelectionTracker.Builder).\n2. Implement [ItemDetailsLookup](/reference/androidx/recyclerview/selection/ItemDetailsLookup).\n3. `ItemDetailsLookup` lets the selection library access information about `RecyclerView` items given a [MotionEvent](/reference/android/view/MotionEvent). It is effectively a factory for [`ItemDetails`](/reference/androidx/recyclerview/selection/ItemDetailsLookup.ItemDetails) instances that are backed up by, or extracted from, a [RecyclerView.ViewHolder](/reference/androidx/recyclerview/widget/RecyclerView.ViewHolder) instance.\n4. Update item [View](/reference/android/view/View) objects in the `RecyclerView` to reflect whether the user selects or unselects them.\n\n The selection library doesn't provide a default visual decoration for the\n selected items. Provide this when you implement\n [onBindViewHolder()](/reference/androidx/recyclerview/widget/RecyclerView.Adapter#onBindViewHolder(VH, int)).\n We recommend the following approach:\n - In `onBindViewHolder()`, call [setActivated()](/reference/android/view/View#setActivated(boolean))---**not** [setSelected()](/reference/android/view/View#setSelected(boolean))---on the `View` object with `true` or `false`, depending on whether the item is selected.\n - Update the styling of the view to represent the activated status. We recommend using a [color state\n list resource](/guide/topics/resources/color-list-resource) to configure the styling.\n5. Use [ActionMode](/reference/androidx/appcompat/view/ActionMode) to provide the user with tools to perform an action on the selection.\n6. Register a [SelectionTracker.SelectionObserver](/reference/androidx/recyclerview/selection/SelectionTracker.SelectionObserver) to be notified when a selection changes. When a selection is first created, start `ActionMode` to present this to the user and provide selection-specific actions. For example, you can add a delete button to the `ActionMode` bar and connect the back arrow on the bar to clear the selection. When the selection becomes empty---if the user clears the selection the last time---terminate action mode.\n7. Perform any interpreted secondary actions.\n8. At the end of the event processing pipeline, the library might determine that the user is attempting to activate an item, by tapping it, or is attempting to drag an item or set of selected items. React to these interpretations by registering the appropriate listener. For more information, see [SelectionTracker.Builder](/reference/androidx/recyclerview/selection/SelectionTracker.Builder).\n9. Assemble everything with `SelectionTracker.Builder`.\n10. The following example shows how to put these pieces together: \n\n### Kotlin\n\n```kotlin\n var tracker = SelectionTracker.Builder(\n \"my-selection-id\",\n recyclerView,\n StableIdKeyProvider(recyclerView),\n MyDetailsLookup(recyclerView),\n StorageStrategy.createLongStorage())\n .withOnItemActivatedListener(myItemActivatedListener)\n .build()\n \n```\n\n### Java\n\n```java\n SelectionTracker tracker = new SelectionTracker.Builder\u003c\u003e(\n \"my-selection-id\",\n recyclerView,\n new StableIdKeyProvider(recyclerView),\n new MyDetailsLookup(recyclerView),\n StorageStrategy.createLongStorage())\n .withOnItemActivatedListener(myItemActivatedListener)\n .build();\n \n```\n11. To build a [SelectionTracker](/reference/androidx/recyclerview/selection/SelectionTracker) instance, your app must supply the same [RecyclerView.Adapter](/reference/androidx/recyclerview/widget/RecyclerView.Adapter) that you use to initialize `RecyclerView` to `SelectionTracker.Builder`. For this reason, after you create the `SelectionTracker` instance, inject it into your `RecyclerView.Adapter`. Otherwise, you can't check an item's selected status from the `onBindViewHolder()` method.\n12. Include selection in the [activity\n lifecycle](/guide/components/activities/activity-lifecycle) events.\n13. To preserve selection state across the activity lifecycle events, your app must call the selection tracker's [onSaveInstanceState()](/reference/androidx/recyclerview/selection/SelectionTracker#onSaveInstanceState(android.os.Bundle)) and [onRestoreInstanceState()](/reference/androidx/recyclerview/selection/SelectionTracker#onRestoreInstanceState(android.os.Bundle)) methods from the activity's [onSaveInstanceState()](/reference/android/app/Activity#onSaveInstanceState(android.os.Bundle)) and [onRestoreInstanceState()](/reference/android/app/Activity#onRestoreInstanceState(android.os.Bundle)) methods, respectively. Your app must also supply a unique selection ID to the `SelectionTracker.Builder` constructor. This ID is required because an activity or a fragment might have more than one distinct, selectable list, all of which need to be persisted in their saved state.\n\nAdditional resources\n--------------------\n\nSee the following references for additional information.\n\n- [Sunflower\n demo app](https://github.com/googlesamples/android-sunflower), which uses `RecyclerView`.\n- [Use\n RecyclerView to display a scrollable list](/codelabs/basic-android-kotlin-training-recyclerview-scrollable-list#0) codelab.\n- [Android\n Kotlin Fundamentals: RecyclerView fundamentals](/codelabs/kotlin-android-training-recyclerview-fundamentals) codelab."]]