RecyclerView ve ListView karşılaştırması


295

Android geliştiricisinden ( Liste ve Kart Oluşturma ):

RecyclerView widget'ı, ListView'in daha gelişmiş ve esnek bir sürümüdür.

Tamam, kulağa hoş geliyor, ancak bu örnek resmi gördüğümde, bu ikisi arasındaki fark hakkında gerçekten kafam karıştı.

resim açıklamasını buraya girin

Yukarıdaki resim ListViewözel adaptör kullanılarak kolayca oluşturulabilir .

Peki, hangi durumda insan kullanılmalıdır RecyclerView?



1
@ Dev786: Bu soruya var olan birçok cevapta ne hissettiğinizi ayrıntılı olarak açıklayan bir yorum eklemenizi öneririm .
CommonsWare

Yanıtlar:


374

RecyclerViewbir ListViewgeliştirme olarak oluşturuldu , bu nedenle evet, ListViewkontrol ile ekli bir liste oluşturabilirsiniz , ancak RecyclerViewkullanımı daha kolay:

  1. Yukarı / aşağı kaydırırken hücreleri yeniden kullanır - bu, ListViewadaptöre View Holder'ı uygulamakla mümkündür , ancak isteğe bağlı bir şeydi, ancak RecycleViewadaptör yazmanın varsayılan yolu budur.

  2. Listeyi kabından ayırır - böylece liste öğelerini çalışma sırasında ayarlarla farklı kaplara (linearLayout, gridLayout) kolayca koyabilirsiniz LayoutManager.

Misal:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. Ortak liste eylemlerini canlandırır - Animasyonlar ayrıştırılır ve bunlara devredilir ItemAnimator.

Hakkında daha çok şey var RecyclerView, ama bence bu noktalar ana noktalar.

Sonuç olarak, RecyclerViewendişe delegasyon kalıplarını izleyen ve sadece tek bir görev - geri dönüşüm maddeleri için ayrılan "liste verilerini" işlemek için daha esnek bir kontrol.


16
Liste görünümünün ana sorumluluğu 1.) verilen alan içindeki öğeleri görsel olarak düzenlemek ve tercihen 2.) öğeleri yeniden kullanmaktır. RecylerView ile bu, tek sorumluluklara dönüşür - görünüm geri dönüşümlerini geri dönüştürün ve LayoutManager'a ekrandaki öğeleri düzenler. Başka bir deyişle, geri dönüşüm görünümü, öğelerin ekrana nasıl yerleştirileceğini bilmiyor / önemsemiyor, sadece geri dönüştürmeyle ilgileniyor. Android doc: "LayoutManager değiştirerek bir RecyclerView standart dikey kaydırma listesi, düzgün bir ızgara, kademeli ızgaralar, yatay kaydırma koleksiyonları ve daha fazlasını uygulamak için kullanılabilir."
daneejela

32
"Yukarı / aşağı kaydırırken hücreleri yeniden kullan": Şimdiye kadar bunun tamamen yanlış olduğunu biliyorum çünkü bu durum izleyici olmadan liste görünümünde bile gerçekleşiyor.
Ruban

16
Liste görünümünde görünüm tutucunun ana kullanımı Kodunuz ListView kaydırması sırasında sık sık findViewById () yöntemini çağırabilir ve bu da performansı yavaşlatabilir. Adaptör geri dönüşüm için şişirilmiş bir görünüm döndürse bile, öğeleri bulmanız ve güncellemeniz gerekir. FindViewById () yönteminin tekrar tekrar kullanılmasının bir yolu, "görünüm tutucu" tasarım desenini kullanmaktır. Bir ViewHolder nesnesi, bileşen görünümlerinin her birini Mizanpaj'ın etiket alanı içinde saklar, böylece tekrar tekrar aramalarına gerek kalmadan bunlara hemen erişebilirsiniz.
Ruban

7
Söylemeye çalıştığım, görünüm sahibi olmadan liste görünümü uyguladığınızda bile Row geri dönüştürülecek. Liste görünümünün özelliği ve avantajı budur. Liste görünümü oluşturdukları şey budur.
Ruban

özel bir şey yapmadılar, bu özellikler herkes tarafından eklenebilir. ListView ve baseAdapter genişletebilir ve isterseniz herhangi bir özellik ekleyebilirsiniz. aslında bu ikisi arasında bir fark yok.
MDP

39

Liste görünümlerinin iyi bir performansa sahip olması için tutucu desenini uygulamanız gerekir ve özellikle listeyi birkaç farklı görünümle doldurmak istediğinizde karıştırmak kolaydır.

RecyclerView, bu kalıbı pişirir ve karıştırmayı zorlaştırır. Aynı zamanda daha esnektir, bir ızgara gibi düz doğrusal olmayan farklı düzenlerin işlenmesini kolaylaştırır.


6
Evet ! , geri dönüşüm görüntülemesinin ne zaman KULLANILMAMASI konusunda daha fazla tartışma yapılmalıdır . Satırlarınız modelin verilerine göre dinamik olarak eklenen içeriğe sahipse ve Recycler görünümünü kullanıyorsanız BOOM'u kullanın.
Rana Deep

1
Model verilerine göre dinamik içerik ekleyebilmeniz gerekir. Desteklemek istediğiniz her tür içerik için farklı görünümler ayarlamanız yeterlidir.
CaptRespect

36

ListViewatasıdır RecyclerView. ListViewYa yapmayan ya da yapmayan birçok şey vardı . Eğer eksikliklerini toplayacak ve ListViewproblemleri farklı alanlara ayırarak sorunu çözseydiniz, geri dönüşümcü görünümü gibi bir şeyle karşılaşırsınız. ListViews ile ilgili temel sorun noktaları şunlardır:

  • ViewAynı öğe türleri için Yeniden Kullanmayı zorunlu ListViewkılmadı (a'da kullanılan bağdaştırıcılardan birine bakın , getView yöntemini incelerseniz, hiçbir şey bir programcının bir satır geçirilse bile her satır için yeni bir görünüm oluşturmasını engellediğini göremezsiniz. convertViewdeğişken üzerinden )

  • Masraflı engel olmadı findViewById(o Devs araman için mümkün olduğu yukarıda belirtildiği gibi görüşlerini geri dönüşüm olsalar bile kullanımları findViewByIdçocuk görüşlerin görüntülenen içeriğini güncellemek için. Ana amacı ViewHolderdesende ListViewsönbelleğe oldu findViewByIdaramaları. Ancak bu sadece oldu platformun bir parçası olmadığı için bunu biliyorsan kullanılabilir)

  • Yalnızca Satır görüntülenen Görünümler ile desteklenen Dikey Kaydırma (Recycler görünümü, görünümlerin nereye yerleştirildiğini ve nasıl taşındıklarını umursamaz, bu, LayoutManagera'ya soyutlanır . Bu nedenle, Recycler ListViewyukarıda gösterildiği gibi geleneksel öğelerin yanı sıra GridView, bununla sınırlı değil, daha fazlasını yapabilir, ancak bunu gerçekleştirmek için programlama ayağı işini yapmanız gerekir).

  • Eklenecek / kaldırılacak animasyonlar, dikkate alınan bir kullanım örneği değildi. Bunu nasıl yapacağınızı bulmak tamamen size kalmış (bir fikir edinmek için RecyclerView. Adaptör sınıflarını bildirmek * yöntemi önerileri v. ListViews karşılaştırmak).

Kısacası RecyclerView, daha esnek bir ListViewkodlama olsa da , parçanızda daha fazla kodlama yapılması gerekebilir.


20

RecyclerViewBenzer bir şekilde bir adaptör tabanlı bir görünüm oluşturmak için hazırlanmış yeni bir ViewGroup olup. Halefi olduğu varsayılır ListView and GridViewve içinde bulunabilir latest support-v7 version. RecyclerViewİle geliştirilmiştir genişletilebilirlik ama biraz ağrı-in-the-eşek dozu olmadan, nedenle aklınıza gelebilecek düzeni her türlü oluşturmak mümkündür, aklında.

Tarafından cevap Antonio leiva

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

RecyclerViewgerçekten bir powerful viewdaha ListView. Daha fazla ayrıntı için Bu sayfayı ziyaret edebilirsiniz .


5
Cevabınızdan bu cümleyi beğendim: Bu Android, bu yüzden işler hiç kolay değil Bu Android uygulama geliştirmenin ne olduğu için doğru, ancak API'yi ve bunların oluşturulacağı desenleri tasarlamada yanlış bir şey olduğunu düşünüyorum. Android uygulaması. Teorik olarak iyi bir tasarım, programcılardan olası tüm karmaşıklıkları gizlemelidir (ancak yine de ileri düzey olanlar için erişilebilir olmalıdır), genel olarak umdukları şey, kullanıcı mantığıyla ilgili sorunları (ve şu anda mevcut olan daha sıkıcı problemleri ele almakla mücadele etmek dışında) iş mantığı, veriler ve diğer algoritmalardır. Android geliştirmede).
Umutsuz

18

Aşağıda RecyclerView ve ListView arasındaki birkaç önemli nokta / fark bulunmaktadır. Çağrınızı akıllıca alın.

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.

RecylerView yerleşik ViewHolder'a sahiptir, listView'de olduğu gibi kendi uygulamalarımızı uygulamamıza gerek yoktur. Belirli bir dizinde de bildirimi destekler

Öğelerin eklenmesini veya kaldırılmasını canlandırma gibi şeyler, hiçbir şey yapmanıza gerek kalmadan RecyclerView'da zaten uygulanmıştır

Bir mizanpaj yöneticisini RecyclerView ile ilişkilendirebiliriz, bu ListView'de sınırlama iken geri dönüşüm görünümünde rastgele görünümler elde etmek için kullanılabilir. Yatay bir ListView uygulamak için resmi bir yol yoktur. Şimdi bir RecyclerView kullanarak,

i) Hem dikey hem de yatay listeleri destekleyen LinearLayoutManager, ii) StaggeredLayoutManager - Pinterest gibi aşamalı listeleri destekler, iii) GridLayoutManager - Galeri uygulamalarında görüldüğü gibi ızgaraların görüntülenmesini destekler.

Ve en iyi şey, tüm bunları istediğimiz gibi dinamik olarak yapabilmemiz.


14

Büyük avantaj :

ViewHolderalanında varsayılan olarak kullanılamaz ListView. Biz açıkça içinde yaratacağız getView(). RecyclerViewdahili Viewholder.


4

Yukarıdaki farklılıklara ek olarak, aşağıdakiler daha azdır:

  1. RV, görünüm oluşturma ve görüntülenecek verilerin bağlanmasını ayırır. LV'de, verileri bağlamadan önce convertView öğesinin görünüm oluşturmak için boş olup olmadığını kontrol etmeniz gerekir. Bu nedenle, RV durumunda, görünüm yalnızca gerektiğinde oluşturulacak, ancak LV durumunda, convertview kontrolünü kaçırabilir ve her zaman görünüm oluşturacaktır.

  2. Izgara ve Liste arasında geçiş yapmak artık LayoutManager ile daha kolay.

  3. Yalnızca tek bir öğe değiştirilse bile tüm öğeleri bildirmeye ve güncellemeye gerek yoktur.

  4. LV durumunda görüş önbelleği uygulamak zorundaydı. Varsayılan olarak RV'de sağlanır. (Görünüm önbelleğe alma ve geri dönüşüm arasında fark vardır.)

  5. RV durumunda çok kolay öğe animasyonları.


4

Liste görünümünde RecyclerView'in avantajları:

  1. Varsayılan olarak ViewHolder içerir.

  2. Kolay animasyonlar.

  3. Yatay, ızgara ve kademeli düzenleri destekler

ListView'ın recyclerView'a göre avantajları:

  1. Bölücü eklemek kolaydır.

  2. Basit düz listeler için dahili dizi

  3. Üstbilgi ve altbilgiyi destekler.

  4. OnItemClickListner'ı destekler.


4
Anladığım kadarıyla kolayca recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));gibi bir şey yaptıktan sonra kullanarak bir recyclerView bir bölücü ekleyebilirsinizrecyclerView = view.findViewById(R.id.feed);
nviens

1
@nviens Liste görünümü için bölücü ekleyebilir, yüksekliğini ayarlayabilir ve rengini xml it self olarak değiştirebilirsiniz. Ayrıca bölücü için geçerli uygulama sadece tamam, daha önce geri dönüşüm görünümü için bölücü eklemek bir kabus oldu, sadece bölücü için önceki uygulamanın stackoverflow.com/a/27037230/6478047
Manohar Reddy

4

RecyclerView ve ListView Arasındaki 8 Fark

Recyclerview ve ListView karşılaştırması

1. ViewHolder Kalıbı

FindViewById () yöntemlerine yapılan çağrıları azaltmak için kullanılan desen .

ListView'da ViewHolder'ı kullanmadan kolayca bir liste oluşturabilirsiniz. Ancak RecyclerView durumunda değil.

2. Adaptör

Her ikisi de AdapterViews, evet. Adaptör sınıfına göre çalışır.

ArrayAdapter, CursorAdapter gibi varsayılan bağdaştırıcıları kullanarak ListView oluşturmak kolaydır, ancak RecyclerView RecyclerView.Adapter sınıfını sağlar, yeni bir özel adaptör sınıfı yapmak için.

RecyclerView ile ArrayAdapter veya başka bir yerleşik adaptörü kullanamazsınız.

3. Eşya Düzenleme

Basit ve daha az kodda Dikey ListView oluşturdum. Peki bir GridView oluşturmamız gerekirse?

RecyclerView, öğelerini düzenlemek için LayoutManager'ı kullanır. 3 LayoutManager sınıfı vardır.

  • LinearLayoutManager - doğrusal tip listesi oluşturmaya yardımcı olur.
  • GridLayoutManager - Izgara oluşturmak için kullanılır.
  • StaggeredGridLayoutManager - Staggeredgrid oluşturmak için kullanılır.

Animasyonlar

ListView temel animasyonlardan yoksundur. Ancak RecyclerView basit animasyonlarla birlikte gelir.

bölen

Android: bölücü ve android: dividerHeight niteliklerini veya setDivider (), setDividerHeight () ListView özel bölücü yapmak için yardımcı olur.

25.1.0'dan beri, basit bir bölücü yapmak için DividerItemDecoration sınıfını kullanabilirsiniz .

Tıklama Etkinlikleri

RecyclerView, OnItemClickListener'dan yoksundur , evet bu çok üzücü. Ancak RecyclerView.OnItemTouchListener sağlayarak geliştiriciye daha fazla denetim sağlar .

Bildirim Yöntemleri

Doğru animasyonları gerçekleştirmek için uygun bildirim * yöntemlerini çağırmanız gerekir. RecylcerView, ListView ile karşılaştırıldığında birçok bildirim * yöntemine sahiptir.


3

Sanırım sahip oldukları en büyük ve en büyük fark ListView, öğeyi oluştururken veya koyarken konumunu bulmak, diğer yandan RecyclerViewöğenin türünü aramasıdır. aynı türden oluşturulmuş başka bir öğe varsa, öğeyi RecyclerViewyeniden oluşturmaz. İlk bağdaştırıcıyı sorar ve sonra geri dönüştürülmüş havuz "evet buna benzer bir tür oluşturdum" diyorsa, o RecyclerViewzaman aynı türü oluşturmaya çalışmazsa , geri dönüştürülmüş havuz ister . ListViewböyle bir havuzlama mekanizması yoktur.


2

Benim görüşüme göre RecyclerView, problemi listelemelerde kullanılan geri dönüşüm modeliyle çözmek için yapıldı çünkü geliştiricinin hayatını zorlaştırıyordu. Diğer tüm az ya da çok halledebiliriz. Mesela ben aynı adaptörü kullanın ListViewve GridViewher iki görünümlerinde önemli değil getView, getItemCount, getTypeCountaynı nedenle kullanılır. Şebeke adaptörleri ile veya şebeke adaptörleri ile zaten çalışıyorsa RecyclerViewgerekli değildir . Deseni liste görünümlerinizde doğru bir şekilde uyguladıysanız, üzerinde büyük bir gelişme görmezsiniz .ListViewListAdapterGridViewViewHolderRecycleView


2

Biraz çalıştım RecyclerViewve hala tercih ediyorum ListView.

  1. Elbette, her ikisi de kullanıyor ViewHolders, bu bir avantaj değil.

  2. A RecyclerViewkodlamada daha zordur.

  3. A RecyclerViewüstbilgi ve altbilgi içermediğinden eksi.

  4. A ListView, ViewHolder yapmayı gerektirmez. Bölümleri veya alt başlıkları içeren bir listeye sahip olmak istediğiniz durumlarda, bağımsız öğeler (ViewHolder olmadan) yapmak iyi bir fikirdir, daha kolaydır ve ayrı sınıflar gerektirmez.


1
recyclerview bağdaştırıcısında üstbilgi ve içerik tarafı yapabilirsiniz ve liste görünümünden daha esnek olacaktır. sadece zihin fikrinizi recyclerview için viewview değiştirmek zor ama bunu yapabilirseniz, ne demek istediğimi anlayacaksınız. listview kullanımdan kaldırıldı sadece geri dönüşüm öğrenmeye çalışın goodluck
erginduran

2
@erginduran, ikisini de kullandım. ListView hala yaygın olarak kullanılmaktadır ve kullanımdan kaldırılmamıştır. Ayrıca RecyclerView'den daha az bellek harcar. Yalnızca bir ListView'ı RecyclerView ile değiştirmek istiyorsanız, bu iyi bir fikir olmayacaktır.
CoolMind

neden bu adamlar için geri dönüşüm görüntüleme geliştirdiğini kontrol edin? liste görünümünü iyileştirmesi, değil mi? google play birçok eski libs ve uygulamalar vardır, bu yüzden doğru listview hala yaygın olarak kullanılmaktadır. sadece geçmişte eski şeyler bırakın. karşılaştırmaları kontrol et -> bağlantı
erginduran

@erginduran, teşekkürler. Haklısın, RecyclerView'in bazı avantajları var. Benim cevabım ListView bazen bir RecyclerView daha kolay olduğu olağan görevleri hakkındaydı. Elbette, ListView'de animasyon ve diğer bazı geliştirmeler zor veya mümkün değil.
CoolMind

Bu konuya bazı yönler ekledim, bkz. Stackoverflow.com/a/39721769/2914140 .
CoolMind

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

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


0

Basit cevap: RecyclerView'ı çok fazla öğe göstermek istediğiniz bir durumda kullanmalısınız ve bunların sayısı dinamiktir. ListView yalnızca öğe sayısı her zaman aynı olduğunda ve ekran boyutu ile sınırlı olduğunda kullanılmalıdır.

Bunu daha zor buluyorsunuz çünkü sadece Android kütüphanesini düşünerek düşünüyorsunuz.

Bugün, kendi bağdaştırıcılarınızı oluşturmanıza yardımcı olacak, seçebileceğiniz, yeniden sıralayabileceğiniz, animasyon kullanabileceğiniz, bölücüler, altbilgi, üstbilgiler vb.

Korkmayın ve RecyclerView'u deneyin, bir ListView ve RecyclerView'da web'den indirilen 100 öğenin (facebook haberleri gibi) bir listesini oluşturmayı sevmeye başlayabilirsiniz, UX (kullanıcıdaki) farkı göreceksiniz. Deneyim) kaydırmaya çalıştığınızda, muhtemelen test uygulaması bunu yapmadan önce duracaktır.

Kolay adaptörler yapmak için bu iki kütüphaneyi kontrol etmenizi tavsiye ederim:

FastAdapter yazan mikepenz

FlexibleAdapter yazan davideas


1
Bence ikisi arasındaki performans farkı hakkındaki ifadeleriniz abartılı. ListView'i 2012'den beri bir üretim uygulamasında kullanıyorum, her satırda ~ 10 farklı Görünümlü 3000'e kadar öğe görüntülüyorum, eski Android 2.3 cihazlarda bile kesinlikle hiçbir sorun performans akıllıca değil.
Magnus W

0

Bilgileri görüntüle

RecyclerViewİle tanıtıldı Android 5.0 (Lollipop). Destek Kitaplığı'na dahildir . Bu nedenle, Android API Seviye 7 ile uyumludur.

Benzer şekilde ListView, RecyclerView’sana fikir de listeleme işlevselliğini performans dostu bir şekilde sağlamaktır. Bu görüşün adının 'Recycler' kısmı tesadüflerle orada değildir. RecyclerViewAslında şu anda çalışıyor hangi öğeleri geri dönüşüm olabilir. Geri dönüşüm işlemi, Görünüm Tutucu adı verilen bir desen sayesinde yapılır .

RecyclerView'ın Artıları ve Eksileri

Artıları:

  • öğe eklemek, güncellemek ve kaldırmak için entegre animasyonlar
  • ViewHolder desenini kullanarak görünümlerin geri dönüştürülmesini sağlar
  • hem ızgaraları hem de listeleri destekler
  • dikey ve yatay kaydırmayı destekler
  • DiffUtil ile birlikte kullanılabilir

Eksileri:

  • karmaşıklık ekler
  • OnItemClickListener yok

ListView bilgileri

ListViewÇok Android'in başlayan yana civarında olmuştur. İçinde bile mevcuttu API Level 1ve aynı amaçlaRecyclerView .

ListView kullanımı gerçekten çok basit. Bu açıdan, halefi gibi değil. Öğrenme eğrisi RecyclerView için olandan daha yumuşaktır. Böylece kavramak daha kolaydır. LayoutManager, ItemAnimator veya DiffUtil gibi şeylerle uğraşmak zorunda değiliz.

ListView'ın Artıları ve Eksileri

Artıları:

  • basit kullanım
  • varsayılan adaptörler
  • kullanılabilir OnItemClickListener
  • bunun temeli ExpandableListView

Eksileri:

  • ViewHolder kalıbının kullanımını kapsamaz

0

ListView ve RecyclerView arasında birçok fark vardır, ancak özellikle aşağıdakilerin farkında olmalısınız:

  • ViewHolder deseni ListView'de tamamen isteğe bağlıdır, ancak RecyclerView içinde pişirilir.
  • ListView yalnızca dikey kaydırmayı destekler, ancak RecyclerView dikey kaydırılan listelerle sınırlı değildir.
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.