Saya baru-baru ini menemukan android RecyclerView
yang dirilis dengan Android 5.0 dan tampaknya itu RecyclerView
hanya tradisional yang dienkapsulasi ListView
dengan pola ViewHolder yang dimasukkan ke dalamnya, yang mempromosikan penggunaan kembali tampilan, daripada membuatnya setiap kali.
Apa manfaat lain dari menggunakan RecyclerView
? Jika keduanya memiliki efek yang sama dalam hal kinerja, mengapa orang lebih memilih RecyclerView`?
Edit
Saya menemukan bahwa orang-orang telah mengajukan pertanyaan serupa dan jawabannya tidak meyakinkan, menambahkannya di sini untuk disimpan.
Haruskah kita menggunakan RecyclerView untuk mengganti ListView?
android
performance
listview
android-recyclerview
Mushtaq Jameel
sumber
sumber
RecyclerView
jauh lebih cepat dan lebih fleksibel dengan API yang jauh lebih baik. Hal-hal seperti menjiwai penambahan atau penghapusan item sudah diterapkanRecyclerView
tanpa Anda harus melakukan apa pun. Tidak ada pertanyaan tentang hal itu, buangListView
di tempat sampah,RecyclerView
ada di sini untuk mencuri perhatian.Jawaban:
Dengan munculnya Android Lollipop, RecyclerView membuat jalannya secara resmi. RecyclerView jauh lebih kuat, fleksibel, dan merupakan peningkatan besar dibandingkan ListView . Saya akan mencoba memberi Anda wawasan terperinci tentang hal itu.
1) Pola TampilanPemegang
Dalam ListView, disarankan untuk menggunakan pola ViewHolder tetapi itu tidak pernah paksaan. Dalam kasus RecyclerView, ini wajib menggunakan kelas RecyclerView.ViewHolder . Ini adalah salah satu perbedaan utama antara ListView dan RecyclerView.
Itu membuat hal-hal sedikit lebih kompleks di RecyclerView tetapi banyak masalah yang kita hadapi di ListView diselesaikan secara efisien.
2) LayoutManager
Ini adalah peningkatan besar lainnya yang dibawa ke RecyclerView. Dalam ListView, satu-satunya jenis tampilan yang tersedia adalah ListView vertikal. Tidak ada cara resmi untuk mengimplementasikan ListView horizontal.
Sekarang menggunakan RecyclerView, kita dapat memiliki
i) LinearLayoutManager - yang mendukung daftar vertikal dan horizontal,
ii) StaggeredLayoutManager - yang mendukung Pinterest seperti daftar terhuyung,
iii) GridLayoutManager - yang mendukung menampilkan grid seperti yang terlihat di aplikasi Galeri.
Dan hal terbaik adalah kita dapat melakukan semua ini secara dinamis seperti yang kita inginkan.
3) Barang Animator
ListViews kurang mendukung animasi yang baik, tetapi RecyclerView membawa dimensi baru ke dalamnya. Menggunakan kelas RecyclerView.ItemAnimator , menjiwai tampilan menjadi sangat mudah dan intuitif.
4) Barang Dekorasi
Dalam kasus ListViews, mendekorasi item secara dinamis seperti menambahkan batas atau pembagi tidak pernah mudah. Tetapi dalam kasus RecyclerView, kelas RecyclerView.ItemDecorator memberikan kontrol besar kepada pengembang tetapi membuat hal-hal sedikit lebih memakan waktu dan kompleks.
5) OnItemTouchListener
Mencegah klik item pada ListView sederhana, berkat antarmuka AdapterView.OnItemClickListener . Tetapi RecyclerView memberi lebih banyak kekuatan dan kontrol kepada pengembangnya oleh RecyclerView.OnItemTouchListener ( Tidak lagi didukung, silakan merujuk ke AndroidX ) tetapi hal itu sedikit mempersulit pengembang.
Dengan kata-kata sederhana, RecyclerView jauh lebih dapat dikustomisasi daripada ListView dan memberikan banyak kontrol dan kekuatan untuk pengembangnya.
sumber
Kelebihan lainnya dari menggunakan
RecycleView
adalah animasi, dapat dilakukan dalam dua baris kodeTapi widgetnya masih mentah, misalnya Anda tidak bisa membuat header dan footer .
sumber
HeaderViewListAdapter
dan menambahkan dukungan header di latar belakang. DenganRecyclerView
Andalah yang memegang kendali.Oke, begitu sedikit penggalian dan saya menemukan permata ini dari artikel Bill Philips di
RecycleView
sumber
Lebih banyak dari artikel Bill Phillip (baca saja!) Tetapi saya pikir penting untuk menunjukkan hal berikut.
sumber
Saya menggunakan
ListView
loader gambar Glide, memiliki pertumbuhan memori. Lalu saya gantiListView
dengan aRecyclerView
. Ini tidak hanya lebih sulit dalam pengkodean, tetapi juga mengarah pada penggunaan memori lebih dari satuListView
. Setidaknya, dalam proyek saya.Dalam aktivitas lain saya menggunakan daftar kompleks dengan
EditText's
. Dalam beberapa dari mereka metode input dapat bervariasi, jugaTextWatcher
dapat diterapkan. Jika saya menggunakanViewHolder
, bagaimana saya bisa menggantiTextWatcher
selama pengguliran? Jadi, saya menggunakanListView
tanpaViewHolder
, dan itu berhasil.sumber
TextWatcher
s di layar. Mungkin Anda benar, tetapi saya tidak bisa memeriksanya.Menggunakan kembali sel saat menggulir ke atas / ke bawah - ini dimungkinkan dengan menerapkan View Holder di adaptor listView, tetapi itu adalah hal opsional, sedangkan di RecycleView itu adalah cara standar penulisan adaptor.
Decouples daftar dari wadahnya - sehingga Anda dapat menempatkan item daftar dengan mudah pada waktu berjalan di wadah yang berbeda (linearLayout, gridLayout) dengan pengaturan LayoutManager.
Contoh:
Animasi tindakan daftar umum.
Animasi dipisahkan dan didelegasikan ke
ItemAnimator
.Ada lebih banyak tentang RecyclerView, tapi saya pikir poin-poin ini adalah yang utama.
Manajer Tata Letak
i) LinearLayoutManager - yang mendukung daftar vertikal dan horizontal,
ii) StaggeredLayoutManager - yang mendukung Pinterest seperti daftar terhuyung,
iii) GridLayoutManager - yang mendukung menampilkan grid seperti yang terlihat di aplikasi Galeri.
Dan hal terbaik adalah kita dapat melakukan semua ini secara dinamis seperti yang kita inginkan.
sumber
1. Lihat Pemegang
Di ListView, mendefinisikan pemegang tampilan adalah pendekatan yang disarankan untuk menyimpan referensi untuk tampilan. Tapi itu bukan paksaan. Meskipun dengan tidak melakukannya, ListView digunakan menunjukkan data basi. Kelemahan utama lainnya dari tidak menggunakan pemegang tampilan dapat menyebabkan operasi yang berat untuk menemukan tampilan oleh id setiap waktu. Yang mengakibatkan ListViews lamban.
Masalah ini diselesaikan di RecylerView dengan menggunakan kelas RecyclerView.ViewHolder. Ini adalah salah satu perbedaan utama dalam RecyclerView dan ListView. Saat menerapkan RecyclerView, kelas ini digunakan untuk mendefinisikan objek ViewHolder yang digunakan oleh adaptor untuk mengikat ViewHolder dengan suatu posisi. Poin lain yang perlu dicatat di sini, adalah bahwa ketika menerapkan adaptor untuk RecyclerView, menyediakan ViewHolder adalah wajib. Ini membuat implementasi sedikit rumit, tetapi menyelesaikan masalah yang dihadapi di ListView.
2. Manajer Tata Letak
Ketika berbicara tentang ListViews, hanya satu jenis ListView yang tersedia yaitu ListView vertikal. Anda tidak dapat menerapkan ListView dengan gulir horizontal. Saya tahu ada cara untuk menerapkan gulir horizontal, tapi percayalah itu tidak dirancang untuk bekerja seperti itu.
Tetapi sekarang ketika kita melihat Android RecyclerView vs ListView, kita juga memiliki dukungan untuk koleksi horisontal. Bahkan mendukung beberapa jenis daftar. Untuk mendukung beberapa jenis daftar, ia menggunakan kelas RecyclerView.LayoutManager. Ini adalah sesuatu yang baru yang tidak dimiliki ListView. RecyclerView mendukung tiga jenis Manajer Tata Letak yang telah ditentukan:
LinearLayoutManager - Ini adalah manajer tata letak yang paling umum digunakan dalam kasus RecyclerView. Melalui ini, kita dapat membuat daftar gulir horizontal dan vertikal. StaggeredGridLayoutManager - Melalui manajer tata letak ini, kita dapat membuat daftar terhuyung. Sama seperti layar Pinterest. GridLayoutManager– Manajer tata letak ini dapat digunakan untuk menampilkan kisi, seperti galeri gambar mana pun.
3. Barang Animator
Animasi dalam daftar adalah dimensi yang sama sekali baru, yang memiliki kemungkinan tak terbatas. Dalam ListView, karena itu tidak ada ketentuan khusus yang melaluinya seseorang dapat menganimasikan, menambah atau menghapus item. Alih-alih nanti seiring perkembangan Android, ViewPropertyAnimator disarankan oleh Google Chet Haase dalam tutorial video ini untuk animasi di ListView.
Di sisi lain membandingkan Android RecyclerView vs ListView, ia memiliki kelas RecyclerView.ItemAnimator untuk menangani animasi. Melalui kelas ini animasi kustom dapat didefinisikan untuk penambahan item, penghapusan, dan memindahkan acara. Juga menyediakan DefaultItemAnimator, jika Anda tidak memerlukan penyesuaian.
4. Adaptor
Adaptor ListView mudah diterapkan. Mereka memiliki metode utama getView di mana semua keajaiban terjadi. Di mana pandangan terikat pada suatu posisi. Mereka juga memiliki metode registerDataSetObserver yang menarik di mana orang dapat mengatur pengamat di adaptor. Fitur ini juga hadir di RecyclerView, tetapi kelas RecyclerView.AdapterDataObserver digunakan untuk itu. Tetapi poin yang mendukung ListView adalah mendukung tiga implementasi standar adaptor:
ArrayAdapter CursorAdapter SimpleCursorAdapter Sedangkan RecyclerView adapter, memiliki semua fungsionalitas yang dimiliki adapter ListView kecuali dukungan bawaan untuk kursor DB dan ArrayLists. Di RecyclerView.Adapter sampai sekarang kita harus membuat implementasi kustom untuk memasok data ke adaptor. Sama seperti yang dilakukan BaseAdapter untuk ListViews. Meskipun jika Anda ingin tahu lebih banyak tentang penerapan adaptor RecyclerView, lihat Contoh Android RecyclerView.
5. Memberitahu Perubahan Data
Saat bekerja dengan ListView, jika kumpulan data diubah, Anda harus memanggil metode notifyDataSetChanged dari adaptor yang mendasarinya untuk menyegarkan data. Atau setel metode setNotifyOnChange ke true memetikan Anda ingin memanggil metode notifyDataSetChanged secara otomatis. Namun dalam kedua kasus, hasilnya sangat besar. Pada dasarnya itu menyegarkan tampilan daftar.
Tetapi sebaliknya dalam adaptor RecyclerView, jika satu item atau serangkaian item telah berubah, ada metode untuk memberitahukan perubahan tersebut. Itu notifyItemChanged dan notifyItemRangeChanged masing-masing dan banyak lagi seperti:
notifyItemInsterted notifyItemMoved notifyItemRangeInsterted notifyItemRangeRemoved Dan tentu saja ia memiliki metode asli untuk menyegarkan seluruh daftar yaitu notifyDataSetChanged yang memberi tahu seluruh paket data yang telah diubah yang telah disesuaikan.
6. Barang Dekorasi
Untuk menampilkan pembagi kustom dalam ListView, orang dapat dengan mudah menambahkan parameter ini di ListView XML:
XHTML android: divider = "@ android: color / transparan" android: dividerHeight = "5dp" 1 2 android: divider = "@ android: color / transparan" android: dividerHeight = "5dp" Bagian yang menarik tentang Android RecyclerView adalah, sampai sekarang ini tidak menunjukkan pembagi antara item secara default. Meskipun orang-orang di Google pasti meninggalkan ini untuk penyesuaian, sengaja. Tapi ini sangat meningkatkan upaya untuk pengembang. Jika Anda ingin menambahkan pembagi antara item, Anda mungkin perlu melakukan implementasi kustom dengan menggunakan kelas RecyclerView.ItemDecoration.
Atau Anda dapat menerapkan peretasan dengan menggunakan file ini dari sampel resmi: DividerItemDecoration.java
7. OnItemTouchListener
Listviews dulunya memiliki implementasi sederhana untuk mendeteksi klik, yaitu dengan menggunakan antarmuka AdapterView.OnItemClickListener.
Tetapi di sisi lain antarmuka RecyclerView.OnItemTouchListener digunakan untuk mendeteksi acara sentuh di Android RecyclerView. Ini sedikit menyulitkan implementasi, tetapi memberikan kontrol yang lebih besar kepada pengembang untuk mencegat acara sentuh. Dokumentasi resmi menyatakan, ini dapat berguna untuk manipulasi gestur karena mencegat acara sentuh sebelum dikirim ke RecyclerView.
sumber
RecyclerView dibuat sebagai peningkatan ListView, jadi ya, Anda dapat membuat daftar terlampir dengan kontrol ListView, tetapi menggunakan RecyclerView lebih mudah karena:
Menggunakan kembali sel saat menggulir ke atas / bawah : ini dimungkinkan dengan menerapkan View Holder di adaptor ListView, tetapi itu adalah hal opsional, sedangkan di RecycleView itu adalah cara standar penulisan adaptor.
Decouples daftar dari wadahnya : sehingga Anda dapat menempatkan item daftar dengan mudah pada waktu berjalan di wadah yang berbeda (linearLayout, gridLayout) dengan pengaturan LayoutManager.
Jadi, untuk menyimpulkan, RecyclerView adalah kontrol yang lebih fleksibel untuk menangani "data daftar" yang mengikuti pola pendelegasian masalah dan hanya menyisakan satu tugas untuk mendaur ulang item saja.
sumber
Jika Anda menggunakan RecycleView, pertama-tama Anda perlu lebih banyak upaya untuk melakukan setup. Anda perlu memberi lebih banyak waktu untuk mengatur Item sederhana klik, batas, acara sentuh dan hal sederhana lainnya. Tetapi produk akhir akan sempurna.
Jadi keputusan ada di tangan Anda. Saya sarankan, jika Anda mendesain aplikasi sederhana seperti memuat buku telepon, di mana klik item yang cukup sudah cukup, Anda bisa menerapkan listview. Tetapi jika Anda mendesain seperti beranda media sosial dengan pengguliran tak terbatas. Beberapa dekorasi berbeda antara item, banyak kontrol item individual daripada menggunakan tampilan daur ulang.
sumber