Haruskah kita menggunakan RecyclerView untuk mengganti ListView?

232

Android Docs mengatakan:

Widget RecyclerView adalah versi ListView yang lebih canggih dan fleksibel. Widget ini adalah wadah untuk menampilkan set data besar yang dapat digulir dengan sangat efisien dengan mempertahankan jumlah tampilan yang terbatas. Gunakan widget RecyclerView ketika Anda memiliki koleksi data yang elemennya berubah saat runtime berdasarkan tindakan pengguna atau peristiwa jaringan

Sebenarnya ListViewbisa melakukan semua hal di atas jika efisiensi tidak masalah, dan kami telah menemukan banyak masalah ketika kami gunakan RecyclerViewuntuk mengganti ListView:

  1. Tidak ada onItemClickListener () untuk pemilihan item daftar - solusi

  2. Tidak ada pembagi antara item daftar - solusi

  3. Tidak ada pemilih tumpang tindih bawaan, tidak ada umpan balik visual ketika Anda mengklik item daftar - solusi

  4. Tidak ada addHeaderView untuk daftar tajuk - solusi

Mungkin lebih banyak masalah ...

Jadi ketika kita gunakan RecyclerViewuntuk mengganti ListView, kita harus melakukan banyak pengkodean tambahan untuk mencapai efek yang sama dengan ListView.

PERTANYAAN:

  • Apakah layak kita ganti ListViewdengan RecyclerViewbenar?
  • jika tidak maka dalam hal ini harus lebih baik kita menggunakan RecyclerViewbukan ListView, dan sebaliknya?
Xcihnegn
sumber
9
utas Anda hanyalah masalah pertama, dan bukan pertanyaan saya
Xcihnegn
3
Sebut saja bahwa Anda harus menggunakan recyclerview jika Anda tertarik menggunakan bilah tindakan yang diciutkan. medium.com/android-bites/…
francas
Anda harus menggunakan recyclerview karena menawarkan lebih banyak kontrol daripada listview. Ini sedikit rumit tetapi Anda sampai di sana maka hidup Anda akan sangat mudah setiap kali Anda berurusan dengan daftar hal semacam itu.
Sadashiv
3
lebih baik adalah musuh yang baik.
oldergod

Jawaban:

118

Jika ListView berfungsi untuk Anda, tidak ada alasan untuk bermigrasi. Jika Anda menulis UI baru, Anda mungkin lebih baik dengan RecyclerView.

RecyclerView sangat kuat ketika Anda perlu menyesuaikan daftar Anda atau Anda ingin animasi yang lebih baik. Metode kenyamanan di ListView menyebabkan banyak masalah bagi orang-orang yang mengapa RecyclerView memberikan solusi yang lebih fleksibel kepada mereka.

Perubahan besar yang perlu Anda lakukan untuk migrasi ada di adaptor Anda. Jika Anda ingin terus menelepon notifyDataSetChanged, Anda kehilangan sebagian besar manfaat animasi & mengikat. Tetapi jika Anda dapat mengubah adaptor Anda untuk mengirimkan acara pemberitahuan terperinci (ditambahkan / dihapus / dipindahkan / diperbarui), maka Anda mendapatkan animasi dan kinerja yang jauh lebih baik. Acara ini memungkinkan RecyclerView memilih animasi yang tepat dan juga membantu menghindari onBindpanggilan yang tidak perlu . Anda akan mendapat manfaat besar jika tampilan item Anda kompleks. Selain itu, ke depan, akan ada lebih banyak komponen di sekitar RecyclerView.

yigit
sumber
2
Jika saya bisa memberi Anda 100 upvotes saya akan. The notifyDataSetChanged()Metode menyebabkan saya RecyclerViewterus meminta baru ViewHolderssepanjang waktu, mengeruk manfaat dari ViewHolderpola. Mencari solusi saya menemukan komentar Anda yang menjawab masalah saya cukup banyak lewat: D terima kasih!
Aspiring Dev
Saya tidak setuju "Anda akan mendapat manfaat besar jika tampilan item Anda kompleks", saya punya recyclerView di mana adaptor memiliki 3 jika lain, Recyclerview berkinerja buruk dalam kasus saya. Saya harus menonaktifkan daur ulang menggunakan isRecyclable(false);dan hasil akhirnya RecyclerView sangat lamban. Aku bahkan tidak bisa mengubah ini, akan butuh banyak waktu untuk kembali ke listview :(
kashyap jimuliya
4
orang menggunakan RV dengan banyak tipe lebih dari itu tanpa masalah dan kinerja yang baik. Ada sesuatu yang salah dalam kode Anda. Anda harus menggunakan systrace / traceview dan melihat apa yang terjadi.
yigit
1
@kashyapjimuliya seperti yang disebutkan yigit , 3 jika-tidak seharusnya menyebabkan itu. Pertama, Anda tidak menyebutkan di mana Anda meletakkan ini jika ada; kedua, menonaktifkan daur ulang harus membuatnya lebih lambat tidak lebih cepat. Mengapa? Karena menggembungkan pandangan dan melakukan findViewById()jauh lebih mahal daripada melakukannya dengan ViewHoldercara itu.
Sufian
24

Menurut saya, jika ListView memenuhi semua kebutuhan aplikasi Anda saat ini dan memenuhi semua kasus penggunaan, maka tidak perlu menggantinya dengan RecyclerView.

RecyclerView memberi kekuatan besar kepada pengembangnya dengan biaya meningkatkan kompleksitas bagi pengembang. Ada hal-hal tertentu yang dapat dilakukan dengan mudah di ListView sekarang dapat mengambil banyak upaya yang tidak perlu.

Tapi ya, ada banyak hal yang tidak bisa dilakukan ListView, seperti fitur LayoutManager yang luar biasa yang dapat memungkinkan Anda untuk mengubah tata letak secara dinamis menjadi horizontal, vertikal, kisi, atau kisi yang terhuyung-huyung dengan mulus.

Saya menulis jawaban terperinci tentang topik ini di sini .

Aritra Roy
sumber
3
Tentu, RecyclerView meningkatkan kompleksitas, tetapi setidaknya menerapkan pola ViewHolder dengan baik untuk Anda.
IgorGanapolsky
@IgorGanapolsky +1 untuk implementasi pola ViewHolder.
Sreekanth Karumanaghat
Anda dapat menulis pola pemegang tampilan Anda sendiri dengan ListView
dan
9

1 Anda dapat menggunakan antarmuka untuk menyediakan pendengar klik. Saya menggunakan teknik ini dengan ListViews juga.
2 Tanpa pembagi: Cukup tambahkan di baris Anda Tampilan dengan lebar match_parent dan tinggi 1dp dan beri warna latar belakang .
3 Cukup gunakan pemilih StateList untuk latar belakang baris.
4 addHeaderView juga dapat dihindari di ListViews: cukup letakkan Header di luar View.

Jadi, jika efisiensi menjadi perhatian Anda, maka ya , itu ide yang baik untuk mengganti ListView dengan RecyclerView.

Phantômaxx
sumber
19
Ini bukan pertanyaan saya, saya punya tautan untuk setiap solusi masalah
Xcihnegn
6

Saya sampai saat ini masih menggunakan ListView untuk daftar yang sangat sederhana. Misalnya jika saya ingin menampilkan daftar opsi teks sederhana ...

Saya mendasarkan keputusan itu pada 'faktor manusia', bahwa membuat ListView sederhana dengan kode lebih sedikit lebih baik jika kinerjanya tidak material. Saya sering berpikir tentang seorang profesor di perguruan tinggi yang gemar mengatakan: "Guru saya Niclaus Wirth yang hebat, penemu Pascal, dulu mengatakan jika suatu program memiliki lebih dari 50 baris kode, pasti salah ..."

Tetapi yang meyakinkan saya untuk berhenti menggunakan ListView adalah bahwa ia baru saja dipindahkan ke kategori "Legacy" di alat desain Android Studio bersama dengan RelativeLayout.

https://developer.android.com/reference/android/widget/ListView

Saya pikir ini adalah bentuk 'penghinaan' yang lunak. Akan terlalu mengganggu jika itu benar-benar usang dan semua pengembang yang teliti memindahkan kode mereka ke RecyclerView.

Lebih lanjut, pengantar ListView memperingatkan tepat di atas bahwa RecyclerView adalah pilihan yang lebih baik: "Untuk pendekatan yang lebih modern, fleksibel, dan berkinerja untuk menampilkan daftar, gunakan RecyclerView."
https://developer.android.com/reference/android/widget/ListView

Juga, panduan untuk ListView masih berbicara tentang pemuat kursor, tetapi kemudian getSupportCursorLoader () itu sendiri baru saja ditinggalkan di API 28.
https://developer.android.com/guide/topics/ui/layout/listview

Perangkat tambahan terbaru untuk Android Studio:

File -> Baru -> Fragmen -> Fragmen (Daftar)

Ini memberi kami RecylerView yang berfungsi penuh yang diisi dengan teks dasar. Itu menghilangkan alasan terakhir saya yang sebenarnya untuk menggunakan ListView karena sekarang sama mudahnya membuat RecylerView dasar.

Singkatnya, saya tidak bermaksud menggunakan ListView sama sekali untuk pengembangan baru karena pelabelan itu memiliki 'warisan' adalah satu langkah lagi dari mencela itu.

Elletlar
sumber
3

Satu-satunya kasus ketika masih baik untuk menggunakan ListView adalah ketika daftar tidak dinamis atau dipengaruhi oleh kejadian jaringan. Misalnya: navigasi.

Untuk kegunaan lain, RecyclerView gerhana ListView. Karena RecyclerView hanya peduli tentang daur ulang, akan lebih mudah untuk melakukan hal-hal terkait visual yang tergabung erat dalam ListView, seperti mengubah posisi / penataan ulang, animasi (sebenarnya ia datang dengan RecyclerView.ItemAnimator), tata letak khusus (stok memiliki StaggeredGrid di samping daftar lama atau gaya kotak tetapi ada juga pustaka ini yang lebih luas).

Juga jika Anda ingin menggunakan CardView, saya percaya ini satu-satunya cara untuk pergi ( membaca dengan baik kapan harus menggunakan kartu atau daftar).

inmyth
sumber
Apakah Anda merujuk untuk mengambil daftar data dari server, kemudian disimpan dalam sqlite di telepon untuk digunakan dalam tampilan daftar (katakanlah pengikut Anda), lebih baik menggunakan tampilan pendaur ulang daripada tampilan daftar dengan pemegang tampilan. ?
Lion789
Iya. Tapi lebih tepatnya saya tidak melihat peran untuk ListView lagi kecuali navigasi dan itu karena saya pikir itu berlebihan untuk menggunakan RecyclerView di sana.
inmyth
2

Alternatif yang bagus menggunakan BaseAdapter. Ini mendukung pola penggunaan Viewholder dan tambang berisi 100 baris dengan bitmap dan tombol dan berjalan sangat lancar.

hibah
sumber