Android Recyclerview vs ListView dengan Viewholder


148

Saya baru-baru ini menemukan android RecyclerViewyang dirilis dengan Android 5.0 dan tampaknya itu RecyclerViewhanya tradisional yang dienkapsulasi ListViewdengan 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.

Recyclerview vs Listview

Haruskah kita menggunakan RecyclerView untuk mengganti ListView?

Mengapa RecyclerView tidak memiliki onItemClickListener ()? dan Bagaimana RecyclerView berbeda dari Listview?


4
Karena RecyclerViewjauh lebih cepat dan lebih fleksibel dengan API yang jauh lebih baik. Hal-hal seperti menjiwai penambahan atau penghapusan item sudah diterapkan RecyclerViewtanpa Anda harus melakukan apa pun. Tidak ada pertanyaan tentang hal itu, buang ListViewdi tempat sampah, RecyclerViewada di sini untuk mencuri perhatian.
Xaver Kapeller

4
Anda dapat mengaitkan pengelola tata letak dengan RecyclerView, sehingga tidak terbatas pada daftar pengguliran vertikal. Ini adalah fungsi tambahan yang cukup kuat.
Alan

@Lan - Apa yang Anda maksud dengan "tidak terbatas pada daftar bergulir vertikal"? Apakah Anda mengatakan bahwa Recycle View dapat bertindak sebagai "placeholder" untuk Gridviews dan ListViews juga?
Mushtaq Jameel

@XaverKapeller - Alangkah baiknya jika Anda bisa mendaftar perbedaan antara keduanya dan menjawab pertanyaan daripada pada komentar, sehingga mungkin membantu saya dan yang lain di masa depan yang mungkin bertanya-tanya tentang hal yang sama?
Mushtaq Jameel

@Alan - Bisakah Anda memberikan sedikit detail tentang apa yang Anda maksud dan menjawab pertanyaan alih-alih pada komentar. Terima kasih telah meluangkan waktu
Mushtaq Jameel

Jawaban:


289

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.


34
Jawaban yang bagus. Beberapa plus besar tambahan: RecyclerView menyiapkan tampilan tepat di depan dan di belakang entri yang terlihat, yang sangat bagus jika Anda mengambil bitmap di latar belakang. Kinerja jauh lebih cepat, terutama jika Anda menggunakan RecyclerView.setHasFixedSize. ListView lama didasarkan pada premis bahwa tidak ada cara untuk menghitung ulang atau cache ukuran entri dalam daftar, yang menyebabkan komplikasi gila ketika menggulir dan melakukan tata letak. Butuh waktu untuk membiasakan diri, tetapi begitu Anda melakukannya, Anda tidak akan pernah kembali.
Robin Davies

@RobinDavies Poin luar biasa. Terima kasih telah menginformasikan. Tetapi tidak masuk akal jika ukuran barang berbeda.
Aritra Roy

@AritraRoy Recyclerview mendukung hanya pada lollipop atau api 14+ (android 4+)? .... seperti yang saya baca "setelah lollipop: di sebagian besar tempat
Animesh Mangla

2
Hai, Aritra, Ketika membandingkan dengan ListView, jika ListView juga menggunakan Pola ViewHolder, Mana yang bertindak lebih efisien? Akankah Recyler melihat yang lebih baik, ketika menggunakan fps atau kriteria serupa lainnya? thx ~
RxRead

@RxRead: Lihat komentar Robin, dia membedakan RecyclerView Vs ListView dengan pola tampilan pemegang dengan alasan kinerja.
Parag Kadam

10

Kelebihan lainnya dari menggunakan RecycleViewadalah animasi, dapat dilakukan dalam dua baris kode

RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
        recyclerView.setItemAnimator(itemAnimator);

Tapi widgetnya masih mentah, misalnya Anda tidak bisa membuat header dan footer .


5
Dan Anda tidak akan pernah bisa membuat header dan footer dalam arti itu. Itu hanya tipe tampilan lain di adaptor Anda. Tampilan daftar membungkus adaptor Anda HeaderViewListAdapterdan menambahkan dukungan header di latar belakang. Dengan RecyclerViewAndalah yang memegang kendali.
Eugen Pechanec

RecyclerView menggunakan DefaultItemAnimator secara default. Lalu mengapa Anda menggunakan kode ini?
Athira Reddy

9

Oke, begitu sedikit penggalian dan saya menemukan permata ini dari artikel Bill Philips diRecycleView

RecyclerView dapat melakukan lebih dari ListView, tetapi kelas RecyclerView sendiri memiliki tanggung jawab lebih sedikit daripada ListView. Di luar kotak, RecyclerView tidak:

  • Posisikan item di layar
  • Tampilan animasi
  • Tangani semua acara sentuh selain dari menggulir

Semua hal ini dimasukkan ke ListView, tetapi RecyclerView menggunakan kelas kolaborator untuk melakukan pekerjaan ini.

ViewHolders yang Anda buat juga lebih gemuk. Mereka subkelas RecyclerView.ViewHolder, yang memiliki banyak metode RecyclerView menggunakan. ViewHolderstahu di mana posisi mereka saat ini terikat, serta id item mana (jika Anda memilikinya). Dalam prosesnya, ViewHolder telah gelar kebangsawanan. Dulu pekerjaan ListView untuk mempertahankan seluruh tampilan item, danViewHolder hanya berpegang pada potongan-potongan kecil itu.

Sekarang, ViewHolder memegang semua itu di ViewHolder.itemView lapangan, yang ditugaskan dalam konstruktor ViewHolder untuk Anda.


4

Lebih banyak dari artikel Bill Phillip (baca saja!) Tetapi saya pikir penting untuk menunjukkan hal berikut.

Di ListView, ada beberapa ambiguitas tentang cara menangani peristiwa klik: Haruskah pandangan individu menangani peristiwa itu, atau haruskah ListView menanganinya melalui OnItemClickListener? Di RecyclerView, ViewHolder berada dalam posisi yang jelas untuk bertindak sebagai objek pengontrol level baris yang menangani detail semacam itu.

Kami telah melihat sebelumnya bahwa LayoutManager menangani tampilan posisi, dan ItemAnimator menangani animasi mereka. ViewHolder adalah bagian terakhir: ia bertanggung jawab untuk menangani peristiwa apa pun yang terjadi pada item tertentu yang ditampilkan RecyclerView.


2

Saya menggunakan ListViewloader gambar Glide, memiliki pertumbuhan memori. Lalu saya ganti ListViewdengan a RecyclerView. Ini tidak hanya lebih sulit dalam pengkodean, tetapi juga mengarah pada penggunaan memori lebih dari satu ListView. Setidaknya, dalam proyek saya.

Dalam aktivitas lain saya menggunakan daftar kompleks dengan EditText's. Dalam beberapa dari mereka metode input dapat bervariasi, juga TextWatcherdapat diterapkan. Jika saya menggunakan ViewHolder, bagaimana saya bisa mengganti TextWatcherselama pengguliran? Jadi, saya menggunakan ListViewtanpa ViewHolder, dan itu berhasil.


Saya menggunakan ListView tanpa ViewHolder, dan berfungsi. ide yang mengerikan ... bagaimana saya bisa mengganti TextWatcher selama pengguliran? tidak perlu menggantinya ... hanya TextWacher yang harus memasukkan data ke dalam wadah yang berbeda setelah menggunakan kembali ... dan itu bisa dilakukan dengan sangat mudah
Selvin

@ Selvin, terima kasih atas pendapat Anda. Sekarang saya tidak dapat mengedit proyek itu. Ada beberapa TextWatchers di layar. Mungkin Anda benar, tetapi saya tidak bisa memeriksanya.
CoolMind

1

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:

mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
  • 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.


1

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.


1

RecyclerView dibuat sebagai peningkatan ListView, jadi ya, Anda dapat membuat daftar terlampir dengan kontrol ListView, tetapi menggunakan RecyclerView lebih mudah karena:

  1. 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.

  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.

mRecyclerView = (RecyclerView) findViewById (R.id.my_recycler_view); mRecyclerView.setLayoutManager (LinearLayoutManager baru (ini)); mRecyclerView.setLayoutManager (GridLayoutManager baru (ini, 2));

  1. Animasi tindakan daftar umum : Animasi dipisahkan dan didelegasikan ke ItemAnimator. Ada lebih banyak tentang RecyclerView, tapi saya pikir poin-poin ini adalah yang utama.

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.


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.