ListView yerine RecyclerView kullanmalı mıyız?


232

Android Dokümanlar şunları söylüyor:

RecyclerView widget'ı, ListView'in daha gelişmiş ve esnek bir sürümüdür. Bu widget, sınırlı sayıda görüntüleme sağlayarak çok verimli bir şekilde kaydırılabilen büyük veri kümelerini görüntülemek için bir kaptır. Kullanıcı eylemine veya ağ olaylarına bağlı olarak öğeleri çalışma zamanında değişen veri koleksiyonlarınız olduğunda RecyclerView widget'ını kullanın

Aslında ListViewverimlilik önemli değilse yukarıdakilerin tümünü yapabilir ve RecyclerViewdeğiştirmek için kullandığımızda birçok sorun bulduk ListView:

  1. Liste öğesi seçimi için onItemClickListener () yoktur - çözüm

  2. Liste öğeleri arasında ayırıcı yok - çözüm

  3. Yerleşik örtüşme seçicisi yok, liste öğesini tıkladığınızda görsel bir geri bildirim yok - çözüm

  4. AddHeaderView yokListe başlığı için - çözüm

Belki daha fazla sorun ...

Bu yüzden RecyclerViewdeğiştirmek için kullandığımızda ListView, aynı etkiye ulaşmak için çok fazla kodlama yapmalıyız.ListView .

SORU:

  • Değiştirmemize değer mi ListView ile RecyclerViewtamamen?
  • değilse , RecyclerViewbunun yerine hangi durumda daha iyi kullanmalıyız ListView?

9
senin konu sadece ilk sorun, ve benim sorum değil
Xcihnegn

3
Daraltılmış bir eylem çubuğu kullanmakla ilgileniyorsanız geri dönüşüm görünümü kullanmanız gerektiğini belirtin. medium.com/android-bites/…
francas

recyclerview kullanmalısınız çünkü liste görünümünden daha fazla kontrol sunar. Litte biraz karmaşık ama oraya var sonra liste tür şeylerle uğraşırken hayatınızı çok kolay olacak.
Sadashiv

3
iyinin düşmanı daha iyidir.
oldergod

Yanıtlar:


118

ListView sizin için çalışıyorsa, geçiş yapmak için bir neden yoktur. Yeni bir kullanıcı arayüzü yazıyorsanız, RecyclerView ile daha iyi durumda olabilirsiniz.

Listenizi özelleştirmeniz gerektiğinde veya daha iyi animasyonlar istediğinizde RecyclerView güçlüdür. ListView'deki bu kolaylık yöntemleri insanlara çok fazla sorun yarattı, bu yüzden RecyclerView onlara daha esnek bir çözüm sunuyor.

Taşıma için yapmanız gereken en büyük değişiklik adaptörünüzde. Aramaya devam etmek istiyorsanız notifyDataSetChanged, animasyon ve ciltleme avantajlarının çoğunu kaybedersiniz. Ancak, adaptörünüzü ayrıntılı bildirim olayları (eklenen / kaldırılan / taşınan / güncellenen) gönderecek şekilde değiştirebilirseniz, çok daha iyi animasyonlar ve performans elde edersiniz. Bu olaylar RecyclerView'in doğru animasyonları seçmesine izin verir ve ayrıca gereksiz onBindaramalardan kaçınmasına yardımcı olur . Öğe görünümleriniz karmaşıksa büyük bir avantaj elde edersiniz. Ayrıca, RecyclerView etrafında daha fazla bileşen olacak.


2
Sana 100 oy verebilirsem yapardım. notifyDataSetChanged()Yöntem gözlerimi neden oldu RecyclerViewyeni soran tutmak için ViewHoldersfaydalarını gutting tüm zamanların ViewHolderdeseni. Çözümü aradığımda, sorunumu çok geçmeden yanıtınızı buldum: D teşekkürler!
Aspiring Dev

"Öğe görünümleriniz karmaşıksa çok büyük bir avantaj elde edersiniz", kabul etmiyorum, hangi adaptörde 3 varsa recyclerView var, Recyclerview benim durumumda kötü performans gösteriyor. Kullanarak geri dönüşümü devre dışı bırakmak zorunda kaldım isRecyclable(false);ve nihai sonuç yüksek gecikmeli RecyclerView. Bunu bile değiştiremiyorum,
listeye

4
insanlar RV w / daha birçok tür w / o herhangi bir sorun ve iyi bir performans kullanın. Kodunuzda başka bir sorun var. Systrace / traceview kullanmalı ve neler olduğunu görmelisiniz.
yigit

1
@kashyapjimuliya olarak yigit o yol açmaması gerekir if-else 3 bahsetti. İlk olarak, eğer bunları başka yere koyduğunuzdan bahsetmediniz; ikincisi, geri dönüşümü devre dışı bırakmak daha hızlı değil daha yavaş olmalıdır. Neden? Çünkü bir görüşü şişirmek ve yapmak findViewById(), böyle yapmaktan çok daha pahalıdır ViewHolder.
Sufian

24

Bana göre, ListView uygulamanızın tüm mevcut ihtiyaçlarını karşılar ve tüm kullanım durumlarını karşılarsa, bunu bir RecyclerView ile değiştirmeye gerek yoktur.

RecyclerView, geliştiricilerine karmaşıklığı artırma pahasına geliştiricilerine büyük bir güç verir. Bir ListView'da kolayca yapılabilecek bazı şeyler var, artık çok fazla gereksiz çaba harcayabilir.

Ancak evet, düzeni dinamik olarak yatay, dikey, ızgara veya kademeli ızgaraya değiştirmenize olanak tanıyan inanılmaz LayoutManager özelliği gibi, bir ListView'ın asla yapamayacağı birçok şey var.

Bu konuya burada ayrıntılı bir cevap yazdım .


3
Elbette, RecyclerView karmaşıklığı artırır, ancak en azından ViewHolder desenini sizin için uygun şekilde uygular.
IgorGanapolsky

ViewHolder kalıp uygulaması için @IgorGanapolsky +1.
Sreekanth Karumanaghat

kendi görünüm tutucu deseninizi bir ListView ile iyi yazabilirsiniz
dan

9

1 Bir tıklama dinleyicisi sağlamak için bir arayüz kullanabilirsiniz. Bu tekniği de ListViews ile kullanıyorum.
2 Ayırıcı yok: Satırınıza match_parent genişliğine ve 1dp yüksekliğe sahip bir Görünüm ekleyin ve ona bir arka plan rengi verin .
3 Sıra arka planı için bir StateList seçici kullanın. ListViews'de de
4 addHeaderView önlenebilir: Üstbilgiyi dışarıya koymanız yeterlidir Görünümün .

Verimlilik endişeniz varsa, evet , bir ListView yerine bir RecyclerView kullanmak iyi bir fikirdir.


19
Bunlar benim sorularım değil, her bir sorun çözümü için bağlantım oldu
Xcihnegn

6

Yakın zamana kadar çok basit listeler için ListView kullanıyordum. Örneğin, metin seçeneklerinin basit bir listesini görüntülemek istersem ...

Bu kararı 'insan faktörleri' temelinde, performansın önemsiz olması durumunda daha az kodlu basit bir ListView oluşturmanın daha iyi olduğuna karar verdim. Sık sık üniversitede söylemeyi seven bir profesör düşünürüm: "Öğretmenim Pascal'ın mucidi olan büyük Niclaus Wirth, bir programın 50'den fazla kod satırı varsa, bunun yanlış olacağından emin olduğunu söylerdi ..."

Ancak beni ListView kullanmayı bırakmaya ikna eden şey, son zamanlarda RelativeLayout ile birlikte Android Studio tasarım aracındaki "Eski" kategorisine taşınmış olmasıdır.

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

Bunun 'yumuşak' bir 'kullanımdan çıkarma' biçimi olduğunu düşünüyorum. Gerçekten onaylanmamış olsaydı ve tüm vicdani geliştiriciler kodlarını RecyclerView'e taşıdıysa çok rahatsız edici olurdu.

Ayrıca, ListView'a giriş, en üstte RecyclerView'in daha iyi bir seçenek olduğu konusunda uyarır: "Listeleri görüntülemek için daha modern, esnek ve performanslı bir yaklaşım için RecyclerView kullanın."
https://developer.android.com/reference/android/widget/ListView

Ayrıca, ListView kılavuzu hala imleç yükleyicilerden bahsediyor, ancak daha sonra getSupportCursorLoader () kendisi API 28'de kullanımdan kaldırıldı.
Https://developer.android.com/guide/topics/ui/layout/listview

Android Studio'daki son geliştirmeler:

Dosya -> Yeni -> Parça -> Parça (Liste)

Bu, bize temel metinle dolu tamamen çalışan bir RecylerView verir. Bu, ListView'i kullanmak için son gerçek nedenimden kurtuldu, çünkü şimdi temel bir RecylerView kurmak kadar kolay.

Özetle, ListView'i yeni geliştirme için kullanmayı düşünmüyorum çünkü etiketleme 'mirası' olan etiketleme onu reddetmekten bir adım uzakta.


3

ListView'ı kullanmaya devam etmenin tek nedeni, listenin dinamik olmadığı veya ağ olaylarından etkilenmediği durumdur. Örneğin: gezinme.

Diğer tüm kullanımlar için RecyclerView, ListView'i yansıtır. RecyclerView yalnızca geri dönüşüme önem verdiğinden, ListView'da sıkıca bağlanmış görsel olarak ilgili şeyleri yapmak daha kolay olacaktır, örneğin pozisyon / yeniden düzenleme, animasyon (aslında RecyclerView.ItemAnimator ile birlikte gelir) gibi özel düzenler (stok StaggeredGrid'e ek olarak eski liste veya ızgara stili, ancak daha da genişleten bu kütüphane de var ).

Eğer CardView kullanmak istiyorsanız Ayrıca gitmek için tek yol olduğuna inanıyorum ( ne zaman kart veya liste kullanmak için bazı iyi okuma ).


Sunuculardan bir veri listesi almayı, daha sonra bir liste görüntüsünde kullanılmak üzere telefondaki sqlite'de depolanmasını (takipçilerinize diyelim) bir görüntüleyici ile bir liste görünümünden daha iyi bir geri dönüşüm görünümü kullanmak daha iyidir ?
Lion789

Evet. Ancak kesin olarak, navigasyon dışında ListView için artık herhangi bir rol görmüyorum ve bunun nedeni, orada RecyclerView kullanmanın aşırı olduğunu düşünüyorum.
inmyth

2

Harika bir alternatif BaseAdapter kullanmaktır. Viewholder desen kullanımını destekler ve benimki bitmapler ve düğmelerle 100'den fazla satır içerir ve çok düzgün çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.