RecyclerView vs. ListView

295

Dari pengembang android ( Membuat Daftar dan Kartu ):

Widget RecyclerView adalah versi ListView yang lebih canggih dan fleksibel.

Oke, kedengarannya keren, tetapi ketika saya melihat contoh gambar ini, saya benar-benar bingung tentang perbedaan antara keduanya.

masukkan deskripsi gambar di sini

Gambar di atas dapat dengan mudah dibuat dengan ListViewmenggunakan adaptor khusus.

Jadi, dalam situasi apa yang harus digunakan RecyclerView?

Blaze Tama
sumber
1
@ Dev786: Saya sarankan Anda menambahkan komentar di sini menjelaskan secara terperinci apa yang Anda rasa hilang dari banyak jawaban yang ada pada pertanyaan ini.
CommonsWare

Jawaban:

374

RecyclerViewdibuat sebagai ListViewpeningkatan, jadi ya, Anda dapat membuat daftar terlampir dengan ListViewkontrol, tetapi menggunakan RecyclerViewlebih mudah karena:

  1. Menggunakan kembali sel saat menggulir ke atas / bawah - ini dimungkinkan dengan menerapkan View Holder di ListViewadaptor, tetapi itu adalah hal opsional, sedangkan di RecycleViewdalamnya itu adalah cara standar penulisan adaptor.

  2. 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:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. Animasi tindakan daftar umum - Animasi dipisahkan dan didelegasikan ke ItemAnimator.

Ada lebih banyak tentang RecyclerView, tetapi saya pikir poin-poin ini adalah yang utama.

Jadi, untuk menyimpulkan, RecyclerViewadalah kontrol yang lebih fleksibel untuk menangani "daftar data" yang mengikuti pola pendelegasian masalah dan hanya menyisakan satu tugas - item daur ulang.

daneejela
sumber
16
Tanggung jawab utama dari tampilan daftar adalah 1.) mengatur item secara visual dalam area yang diberikan dan lebih disukai 2.) menggunakan kembali item. Dengan RecylerView ini dibagi menjadi satu tanggung jawab - daur ulang tampilan daur ulang dan itu diberikan LayoutManager mengatur item di layar. Dengan kata lain, tampilan daur ulang tidak tahu / peduli di mana harus meletakkan barang di layar, hanya perlu daur ulang. Dari android doc: "Dengan mengubah LayoutManager, RecyclerView dapat digunakan untuk menerapkan daftar pengguliran vertikal standar, kisi yang seragam, kisi-kisi yang
terseok
32
"Gunakan kembali sel sambil menggulir ke atas / bawah": Sejauh yang saya tahu ini sepenuhnya salah Karena ini terjadi bahkan dalam tampilan daftar tanpa pemirsa.
Ruban
16
Penggunaan utama view holder dalam listview adalah Kode Anda mungkin sering memanggil findViewById () selama pengguliran ListView, yang dapat memperlambat kinerja. Bahkan ketika Adaptor mengembalikan tampilan yang meningkat untuk didaur ulang, Anda masih perlu mencari elemen dan memperbaruinya. Cara untuk mengulangi penggunaan findViewById () adalah dengan menggunakan pola desain "view holder". Objek ViewHolder menyimpan setiap tampilan komponen di dalam bidang tag dari Layout, sehingga Anda dapat langsung mengaksesnya tanpa perlu melihatnya berulang kali.
Ruban
7
Apa yang saya coba katakan adalah Row akan didaur ulang bahkan ketika Anda menerapkan listview tanpa pemegang tampilan. Itu adalah properti dan keuntungan dari listview. Itulah yang mereka buat listview.
Ruban
mereka tidak melakukan sesuatu yang istimewa, fitur-fitur ini dapat ditambahkan oleh siapa saja. Anda dapat memperluas ListView dan baseAdapter dan menambahkan fitur apa pun ke dalamnya jika Anda mau. sebenarnya tidak ada perbedaan antara keduanya.
MDP
39

Agar tampilan daftar memiliki kinerja yang baik, Anda perlu menerapkan pola penahan, dan itu mudah berantakan terutama ketika Anda ingin mengisi daftar dengan beberapa jenis tampilan yang berbeda.

The RecyclerView membuat pola ini masuk, membuatnya lebih sulit untuk dikacaukan. Ini juga lebih fleksibel, membuatnya lebih mudah untuk menangani tata letak yang berbeda, yang tidak lurus linear, seperti kisi.

CaptRespect
sumber
6
Iya ! , harus ada lebih banyak diskusi tentang kapan TIDAK menggunakan recyclerview juga. Jika baris Anda memiliki konten yang ditambahkan secara dinamis berdasarkan data model dan Anda menggunakan tampilan Pendaur Ulang, BOOM.
Rana Deep
1
Anda harus dapat menambahkan konten dinamis berdasarkan data model. Anda hanya perlu mengatur tampilan berbeda untuk semua jenis konten yang ingin Anda dukung.
CaptRespect
36

ListViewadalah nenek moyang untuk RecyclerView. Ada banyak hal yang ListViewtidak dilakukan, atau tidak dilakukan dengan baik. Jika Anda mengumpulkan kekurangan ListViewdan memecahkan masalah dengan mengabstraksi masalah ke dalam domain yang berbeda, Anda akan berakhir dengan sesuatu seperti tampilan pendaur ulang. Berikut adalah poin masalah utama dengan ListViews:

  • Tidak menerapkan ViewReuse untuk jenis item yang sama (lihat salah satu adapter yang digunakan dalam ListView, jika Anda mempelajari metode getView, Anda akan melihat bahwa tidak ada yang mencegah programmer membuat tampilan baru untuk setiap baris bahkan jika salah satunya dilewatkan) melalui convertViewvariabel)

  • Tidak mencegah findViewByIdpenggunaan yang mahal (Bahkan jika Anda mendaur ulang tampilan seperti yang disebutkan di atas, mungkin saja devs menelepon findViewByIduntuk memperbarui konten yang ditampilkan dari tampilan anak. Tujuan utama ViewHolderpola ini ListViewsadalah untuk menyimpan findViewByIdpanggilan. Namun ini hanya tersedia jika Anda mengetahuinya karena itu bukan bagian dari platform sama sekali)

  • Hanya didukung Pengguliran Vertikal dengan Tampilan yang ditampilkan Baris (Tampilan pendaur ulang tidak peduli di mana pandangan ditempatkan dan bagaimana mereka dipindahkan, itu disarikan ke dalam LayoutManager. Seorang Pendaur Ulang dapat mendukung tradisional ListViewseperti yang ditunjukkan di atas, serta hal-hal seperti GridView, tetapi itu tidak terbatas pada itu, itu bisa berbuat lebih banyak, tetapi Anda harus melakukan pekerjaan pemrograman kaki untuk mewujudkannya).

  • Animasi untuk ditambahkan / dihapus bukan kasus penggunaan yang dianggap. Itu sepenuhnya terserah Anda untuk mencari tahu bagaimana melakukan ini (bandingkan RecyclerView. Kelas adaptor memberitahukan * metode penawaran v. ListViews untuk mendapatkan ide).

Singkatnya RecyclerViewadalah cara yang lebih fleksibel ListView, meskipun lebih banyak pengkodean mungkin perlu dilakukan pada bagian Anda.

Jim Baca
sumber
20

Ini RecyclerViewadalah ViewGroup baru yang disiapkan untuk menyajikan tampilan berbasis adaptor apa pun dengan cara yang serupa. Ini dianggap sebagai penerus ListView and GridView, dan dapat ditemukan di Internet latest support-v7 version. The RecyclerViewtelah dikembangkan dengan diperpanjang dalam pikiran, sehingga dimungkinkan untuk membuat segala jenis tata letak yang dapat Anda pikirkan, tetapi tidak tanpa dosis sakit-in-the-ass kecil.

Jawaban diambil dari Antonio leiva

 compile 'com.android.support:recyclerview-v7:27.0.0'

RecyclerViewmemang powerful viewdari ListView. Untuk lebih jelasnya Anda dapat mengunjungi halaman ini .

IntelliJ Amiya
sumber
5
Saya menyukai kalimat ini dari jawaban Anda: Ini adalah Android, jadi segala sesuatunya tidak pernah mudah. Ini berlaku untuk apa yang sedang dikembangkan oleh aplikasi Android, tapi saya pikir itu adalah sesuatu yang salah dalam bagaimana mereka mendesain API serta pola untuk membangun Aplikasi Android. Secara teoritis desain yang baik harus menyembunyikan semua kemungkinan kompleksitas dari programmer (tetapi masih dapat diakses untuk yang canggih), apa yang biasanya mereka pedulikan adalah logika bisnis, data dan algoritma lain selain berjuang menangani masalah terkait UI (dan masalah yang lebih membosankan saat ini ada dalam pengembangan Android).
Putus asa
18

Berikut adalah beberapa poin / perbedaan utama antara RecyclerView & ListView. Terima teleponmu dengan bijak.

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

RecylerView memiliki ViewHolder bawaan, tidak perlu mengimplementasikan sendiri seperti di listView. Ini mendukung pemberitahuan pada indeks tertentu juga

Hal-hal seperti menjiwai penambahan atau penghapusan item sudah diterapkan di RecyclerView tanpa Anda harus melakukan apa pun

Kita dapat mengaitkan seorang manajer tata letak dengan RecyclerView, ini dapat digunakan untuk mendapatkan tampilan acak di recycleview sementara ini terbatas pada ListView 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 kisi-kisi seperti yang terlihat pada aplikasi Galeri.

Dan hal terbaik adalah kita dapat melakukan semua ini secara dinamis seperti yang kita inginkan.

Pawan Maheshwari
sumber
14

Keuntungan utama:

ViewHoldertidak tersedia secara default di ListView. Kami akan membuat secara eksplisit di dalam getView(). RecyclerViewmemiliki built-in Viewholder.

Mohammed Imran N
sumber
4

Selain perbedaan-perbedaan di atas, beberapa di bawah ini juga lebih sedikit:

  1. RV memisahkan pembuatan tampilan dan pengikatan data untuk dilihat. Di LV, Anda perlu memeriksa apakah convertView adalah nol atau tidak untuk membuat tampilan, sebelum mengikat data ke sana. Jadi, dalam kasus RV, tampilan akan dibuat hanya ketika diperlukan tetapi dalam kasus LV, orang dapat melewatkan pemeriksaan untuk konversi dan akan membuat tampilan setiap kali.

  2. Beralih antara Grid dan Daftar lebih mudah sekarang dengan LayoutManager.

  3. Tidak perlu memberi tahu dan memperbarui semua item, meskipun hanya satu item yang diubah.

  4. Seseorang harus mengimplementasikan view caching dalam kasus LV. Ini disediakan dalam RV secara default. (Ada perbedaan antara tampilan caching dan daur ulang.)

  5. Animasi item yang sangat mudah untuk RV.

Virat18
sumber
4

Keuntungan RecyclerView dari pada tampilan daftar:

  1. Berisi ViewHolder secara default.

  2. Animasi mudah.

  3. Mendukung tata letak horizontal, kotak, dan terhuyung

Keuntungan dari listView daripada recyclerView:

  1. Mudah untuk menambahkan pembagi.

  2. Dapat menggunakan inbuilt arrayAdapter untuk daftar sederhana

  3. Mendukung Header dan footer.

  4. Mendukung OnItemClickListner.

Manohar Reddy
sumber
4
Sejauh yang saya mengerti Anda dapat dengan mudah menambahkan pembagi ke recyclerView menggunakan recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));setelah melakukan sesuatu sepertirecyclerView = view.findViewById(R.id.feed);
nviens
1
@nviens Untuk tampilan daftar Anda dapat menambahkan pembagi, sesuaikan ketinggiannya dan ubah warnanya semua dalam xml sendiri. Juga implementasi saat ini untuk pembagi hanya ok, itu adalah mimpi buruk untuk menambahkan pembagi untuk recyclerview sebelumnya, cukup periksa jawaban ini untuk melihat bagaimana implementasi sebelumnya untuk pembagi adalah stackoverflow.com/a/27037230/6478047
Manohar Reddy
4

8 Perbedaan Antara RecyclerView dan ListView

Recyclerview vs ListView

1. Pola TampilanPemegang

Pola yang digunakan untuk mengurangi panggilan ke metode findViewById () .

Di ListView, Anda dapat dengan mudah membuat daftar tanpa menggunakan ViewHolder. Tetapi tidak dalam kasus RecyclerView.

2. Adaptor

Keduanya adalah AdapterViews, ya. Ini bekerja berdasarkan kelas adaptor.

Sangat mudah untuk membangun ListView menggunakan adaptor default seperti ArrayAdapter, CursorAdapter tetapi RecyclerView menyediakan kelas RecyclerView.Adapter, Untuk membuat kelas adaptor kustom baru.

Anda tidak dapat menggunakan ArrayAdapter atau adaptor bawaan lainnya dengan RecyclerView.

3. Pengaturan Barang

Saya telah membuat Vertikal ListView dalam kode sederhana dan kurang. Tetapi bagaimana jika kita perlu membuat GridView?

RecyclerView menggunakan LayoutManager untuk mengatur barang-barangnya. Ada 3 kelas LayoutManager.

  • LinearLayoutManager - membantu membuat daftar jenis linier.
  • GridLayoutManager - Digunakan untuk membuat Grid.
  • StaggeredGridLayoutManager - Digunakan untuk membuat staggeredgrid.

Animasi

ListView tidak memiliki animasi dasar. Tapi RecyclerView hadir dengan animasi sederhana.

Pembagi

The android: pembagi dan android: dividerHeight atribut atau setDivider (), setDividerHeight () membantu Anda untuk membuat kustom pembagi di ListView.

sejak 25.1.0, Anda bisa menggunakan kelas DividerItemDecoration untuk membuat pembagi sederhana.

Klik Acara

RecyclerView tidak memiliki OnItemClickListener , ya itu sangat menyedihkan. Tetapi mereka memberikan kontrol lebih besar kepada pengembang dengan menyediakan RecyclerView.OnItemTouchListener.

Beri tahu Metode

Anda perlu memanggil metode pemberitahuan * yang tepat untuk melakukan animasi yang benar. RecylcerView memiliki banyak metode * pemberitahuan bila dibandingkan dengan ListView.

Vijay Ram
sumber
3

Saya pikir perbedaan utama dan terbesar yang mereka miliki adalah yang ListViewmencari posisi item saat membuat atau meletakkannya, di sisi lain RecyclerViewmencari jenis item. jika ada item lain yang dibuat dengan jenis yang sama RecyclerViewtidak membuatnya lagi. Itu meminta adaptor pertama dan kemudian meminta untuk daur ulang, jika kolam daur ulang mengatakan "ya saya telah membuat jenis yang mirip dengan itu", maka RecyclerViewjangan mencoba untuk membuat jenis yang sama. ListViewtidak memiliki mekanisme pengumpulan seperti ini.

Mustafa Güven
sumber
2

Menurut pendapat saya RecyclerViewdibuat untuk mengatasi masalah dengan pola daur ulang yang digunakan dalam tampilan daftar karena itu membuat hidup pengembang lebih sulit. Semua yang bisa Anda tangani kurang lebih. Misalnya saya menggunakan adaptor yang sama untuk ListViewdan GridViewtidak peduli di kedua pandangan tersebut getView, getItemCount, getTypeCountdigunakan sehingga itu sama. RecyclerViewtidak diperlukan jika ListViewdengan ListAdapteratau GridViewdengan adapter jaringan sudah bekerja untuk Anda. Jika Anda telah menerapkan ViewHolderpola dalam tampilan daftar dengan benar, maka Anda tidak akan melihat peningkatan besar RecycleView.

aimiliano
sumber
2

Saya bekerja sedikit dengan RecyclerViewdan masih lebih suka ListView.

  1. Tentu, keduanya digunakan ViewHolders, jadi ini bukan keuntungan.

  2. A RecyclerViewlebih sulit dalam pengkodean.

  3. A RecyclerViewtidak mengandung header dan footer, jadi ini adalah minus.

  4. A ListViewtidak perlu membuat ViewHolder. Dalam kasus di mana Anda ingin memiliki daftar dengan bagian atau subjudul, sebaiknya membuat item independen (tanpa ViewHolder), lebih mudah dan tidak memerlukan kelas yang terpisah.

CoolMind
sumber
1
Anda dapat membuat header dan sisi konten di adaptor recyclerview dan itu akan lebih fleksibel daripada listview. hanya sulit untuk mengubah pandangan pikiran Anda menjadi recyclerview tetapi jika Anda dapat melakukan ini, Anda akan mengerti apa yang saya maksud. listview usang hanya pergi mencoba belajar recyclerview goodluck
erginduran
2
@erginduran, saya menggunakan keduanya. ListView masih banyak digunakan dan tidak usang. Itu juga menghabiskan lebih sedikit memori daripada RecyclerView. Jika Anda hanya ingin mengganti ListView dengan RecyclerView, itu bukan ide yang baik.
CoolMind
cukup periksa mengapa orang ini mengembangkan recyclerview? peningkatan listview, kan? ada banyak lib dan aplikasi lama di google play sehingga listview Anda benar masih banyak digunakan. Cukup tinggalkan hal-hal lama di masa lalu. periksa perbandingan -> tautan
erginduran
@erginduran, terima kasih. Anda benar, RecyclerView memiliki beberapa kelebihan. Jawaban saya adalah tentang tugas-tugas biasa di mana ListView terkadang lebih mudah daripada RecyclerView. Tentu saja, animasi dan beberapa peningkatan lainnya sulit atau tidak mungkin dilakukan dalam ListView.
CoolMind
Saya menambahkan beberapa aspek dalam topik itu, lihat stackoverflow.com/a/39721769/2914140 .
CoolMind
1
  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 berikan warna latar belakang.
  3. Cukup gunakan pemilih StateList untuk latar belakang baris.
  4. addHeaderView juga bisa 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.

Jay Patel
sumber
0

Jawaban sederhana: Anda harus menggunakan RecyclerView dalam situasi di mana Anda ingin menunjukkan banyak item, dan jumlah item itu dinamis. ListView hanya boleh digunakan ketika jumlah item selalu sama dan terbatas pada ukuran layar.

Anda merasa lebih sulit karena Anda berpikir hanya dengan perpustakaan Android dalam pikiran.

Saat ini ada banyak opsi yang membantu Anda membangun adaptor Anda sendiri, membuatnya mudah untuk membangun daftar dan kisi-kisi item dinamis yang dapat Anda pilih, atur ulang, gunakan animasi, pembagi, tambahkan footer, header, dll., Dll.

Jangan takut dan coba RecyclerView, Anda dapat mulai menyukainya membuat daftar 100 item yang diunduh dari web (seperti berita facebook) di ListView dan RecyclerView, Anda akan melihat perbedaan dalam UX (pengguna) pengalaman) ketika Anda mencoba menggulir, mungkin aplikasi uji akan berhenti sebelum Anda bahkan dapat melakukannya.

Saya sarankan Anda untuk memeriksa dua perpustakaan ini untuk membuat adaptor mudah:

FastAdapter oleh mikepenz

FlexibleAdapter oleh davideas

Erick Moya
sumber
1
Saya pikir pernyataan Anda tentang perbedaan kinerja antara keduanya berlebihan. Saya telah menggunakan ListView dalam aplikasi produksi sejak 2012, menampilkan hingga 3000 item dengan ~ 10 Tampilan berbeda di setiap baris, sama sekali tidak ada masalah kinerja meskipun pada perangkat Android 2.3 yang lama.
Magnus W
0

Info RecyclerView

Itu RecyclerViewdiperkenalkan dengan Android 5.0 (Lollipop). itu termasuk dalam Perpustakaan Dukungan . Dengan demikian, ini kompatibel dengan Android API Level 7.

Demikian pula dengan ListView, RecyclerView’side utama adalah untuk menyediakan fungsionalitas daftar dengan cara yang ramah kinerja. Bagian 'Pendaur Ulang' dari nama tampilan ini tidak ada di sana secara kebetulan. The RecyclerViewbenar-benar dapat mendaur ulang barang-barang dengan yang saat ini bekerja. Proses daur ulang dilakukan berkat pola yang disebut View Holder .

Pro & Kontra dari RecyclerView

Pro:

  • animasi terintegrasi untuk menambah, memperbarui, dan menghapus item
  • memberlakukan daur ulang tampilan dengan menggunakan pola ViewHolder
  • mendukung kisi dan daftar
  • mendukung pengguliran vertikal dan horizontal
  • dapat digunakan bersama dengan DiffUtil

Cons:

  • menambah kompleksitas
  • tidak ada OnItemClickListener

Info ListView

The ListViewtelah ada sejak sangat awal Android. Itu tersedia bahkan di API Level 1dan memiliki tujuan yang sama dengan RecyclerView.

Penggunaan ListView sebenarnya sangat sederhana. Dalam aspek ini, tidak seperti penggantinya. Kurva pembelajaran lebih halus daripada kurva untuk RecyclerView. Dengan demikian, lebih mudah dipahami. Kami tidak harus berurusan dengan hal-hal seperti LayoutManager, ItemAnimator atau DiffUtil.

Pro & Kontra dari ListView

Pro:

  • penggunaan sederhana
  • adaptor default
  • tersedia OnItemClickListener
  • itu adalah dasar dari ExpandableListView

Cons:

  • tidak mencakup penggunaan pola ViewHolder
Basi
sumber
0

Ada banyak perbedaan antara ListView dan RecyclerView, tetapi Anda harus mengetahui hal-hal berikut secara khusus:

  • Pola ViewHolder sepenuhnya opsional di ListView, tetapi dimasukkan ke dalam RecyclerView.
  • ListView hanya mendukung pengguliran vertikal, tetapi RecyclerView tidak terbatas pada daftar pengguliran vertikal.
sachin pareek
sumber