Viewholder ile Android Recyclerview ve ListView


150

Yakın zamanda RecyclerViewAndroid 5.0 ile piyasaya sürülen android ile karşılaştım ve görünüşe göre bu RecyclerView, ListViewher seferinde onu oluşturmaktan ziyade görünümün yeniden kullanımını teşvik eden, ViewHolder desenine dahil edilmiş geleneksel bir kapsüllenmiş gibi görünüyor .

Kullanmanın diğer faydaları nelerdir RecyclerView? Her ikisi de performans açısından aynı etkiye sahipse, neden RecyclerView` tercih edilir?

Düzenle

İnsanların benzer soru sorduğunu ve yanıtların kesin olmadığını, kayıt tutma amacıyla buraya eklediklerini gördüm.

Recyclerview vs Listview

ListView yerine RecyclerView kullanmalı mıyız?

RecyclerView neden onItemClickListener () içermiyor? ve RecyclerView Listview'den ne kadar farklıdır?


4
Çünkü RecyclerViewçok daha iyi bir API ile çok daha hızlı ve çok yönlü. Öğelerin eklenmesi veya kaldırılmasına animasyon uygulamak gibi şeyler, RecyclerViewsiz hiçbir şey yapmanıza gerek kalmadan zaten uygulanmaktadır . Hiç şüphe yok ki ListView, çöp tenekesine atın RecyclerView, şovu çalmak için burada.
Xaver Kapeller

4
Bir düzen yöneticisini RecyclerView ile ilişkilendirebilirsiniz, böylece bunlar dikey olarak kaydırılan listelerle sınırlı değildir. Bu oldukça güçlü bir ek işlevdir.
Alan

@Alan - "Dikey kaydırma listeleri ile sınırlı değil" derken neyi kastediyorsunuz? Geri Dönüşüm Görünümünün Izgara Görünümleri ve Liste Görünümleri için de bir "yer tutucu" işlevi görebileceğini mi söylüyorsunuz?
Mushtaq Jameel

@XaverKapeller - İkisi arasındaki farkları listeleyip bir yorumdan ziyade soruyu cevaplarsanız harika olur, böylece bana ve gelecekte aynı şeyi merak eden diğerlerine yardımcı olabilir?
Mushtaq Jameel

@Alan - Ne demek istediğinizle ilgili biraz ayrıntı verebilir misiniz ve bir yorum yerine soruyu yanıtlayabilir misiniz? Zaman ayırdığınız için teşekkürler
Mushtaq Jameel

Yanıtlar:


10

Kullanmanın bir diğer artısı RecycleViewanimasyon, iki satır kodla yapılabilir

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

Ancak widget hala işlenmemiş durumda, örneğin üst bilgi ve alt bilgi oluşturamazsınız .


5
Ve bu anlamda asla üstbilgi ve altbilgi oluşturamazsınız. Adaptörünüzdeki diğer görünüm türleridir. Liste görünümü adaptörünüzü sarar HeaderViewListAdapterve arka planda başlık desteği ekler. İle RecyclerViewsize kontrolünde birisin.
Eugen Pechanec

RecyclerView, varsayılan olarak bir DefaultItemAnimator kullanır. O zaman neden bu kodu kullandın?
Athira Reddy

9

Pekala, biraz kazdım ve bu mücevherleri Bill Philips makalesinde buldum .RecycleView

RecyclerView, ListView'den daha fazlasını yapabilir, ancak RecyclerView sınıfının kendisinin ListView'den daha az sorumluluğu vardır. RecyclerView kutunun dışında şunları yapmaz:

  • Öğeleri ekranda konumlandırın
  • Görünümleri canlandırın
  • Kaydırma dışında tüm dokunma olaylarını yönetin

Tüm bunlar ListView'da hazırlanmıştır, ancak RecyclerView bu işleri yapmak için ortak çalışan sınıfları kullanır.

Oluşturduğunuz ViewHolders da daha güçlüdür. Bunlar RecyclerView.ViewHolder, birçok yöntemin RecyclerView kullanıldığı alt sınıftır . ViewHoldersŞu anda hangi pozisyona bağlı olduklarını ve hangi öğe kimliklerini (eğer varsa) bilin. Bu süreçte ViewHolder şövalye oldu. ListView’in tüm öğe görünümünü tutmak için yaptığı işti ve ViewHolderyalnızca küçük parçalarına tutulmuştu.

Şimdi, ViewHolder, ViewHolder'ın ViewHolder.itemView kurucusunda sizin için atanan alandaki hepsini tutar .


4

Bill Phillip'in makalesinden daha fazlası (gidin okuyun!) Ama aşağıdakilere dikkat çekmenin önemli olduğunu düşündüm.

ListView'da, tıklama olaylarının nasıl işleneceği konusunda bazı belirsizlikler vardı: Bireysel görünümler bu olayları işlemeli mi yoksa ListView bunları OnItemClickListener aracılığıyla mı işlemelidir? RecyclerView'da, yine de ViewHolder, bu tür ayrıntıları işleyen bir satır düzeyinde denetleyici nesnesi olarak hareket etmek için açık bir konumdadır.

Daha önce LayoutManager'ın konumlandırma görünümlerini işlediğini ve ItemAnimator'ın bunları canlandırdığını görmüştük. ViewHolder son parçadır: RecyclerView'ün görüntülediği belirli bir öğede meydana gelen olayları işlemekten sorumludur.


2

ListViewBellek artışı olan bir Glide görüntü yükleyici kullandım . Sonra ListViewa ile değiştirdim RecyclerView. Yalnızca kodlamada daha zor olmakla kalmaz, aynı zamanda a'dan daha fazla bellek kullanımına da yol açar ListView. En azından benim projemde.

Başka bir aktivitede karmaşık bir liste kullandım EditText's. Bazılarında bir girdi yöntemi değişebilir, ayrıca bir TextWatcherde uygulanabilir. Bir kullansaydım, kaydırma sırasında a'yı ViewHoldernasıl değiştirebilirim TextWatcher? Yani, a ListViewolmadan kullandım ViewHolderve işe yarıyor.


ViewHolder olmadan ListView kullandım ve işe yarıyor. berbat bir fikir ... kaydırma sırasında bir TextWatcher'ı nasıl değiştirebilirim? değiştirmeye gerek yok ... sadece TextWacher verileri yeniden kullandıktan sonra farklı bir kaba koymalı ... ve bu gerçekten çok kolay yapılabilir
Selvin

@Selvin, fikrin için teşekkürler. Şimdi o projeyi düzenleyemiyorum. TextWatcherEkranda birkaç s vardı . Muhtemelen haklısın, ama kontrol edemiyorum.
CoolMind

1

Yukarı / aşağı kaydırırken hücreleri yeniden kullanır - bu, listView adaptöründe Görünüm Tutucusunu uygulamakla mümkündür, ancak bu isteğe bağlı bir şeydi, RecycleView'da ise adaptör yazmanın varsayılan yolu.

Listeyi kendi kabından ayırır - böylece LayoutManager'ı ayarlayarak liste öğelerini farklı kaplara (linearLayout, gridLayout) çalışma zamanında kolayca yerleştirebilirsiniz.

Misal:

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));
  • Yaygın liste eylemlerini canlandırır.

  • Animasyonlar ayrılır ve delege edilir ItemAnimator.

RecyclerView hakkında daha fazlası var, ancak bence bu noktalar ana noktalar.

LayoutManager

i) LinearLayoutManager - hem dikey hem de yatay listeleri destekleyen,

ii) StaggeredLayoutManager - Pinterest'i kademeli listeler gibi destekleyen,

iii) GridLayoutManager - Galeri uygulamalarında görüldüğü gibi ızgaraların görüntülenmesini destekler.

Ve en iyisi, tüm bunları istediğimiz gibi dinamik bir şekilde yapabilmemiz.


1

RecyclerView bir ListView iyileştirmesi olarak oluşturuldu, bu nedenle evet, ListView kontrolü ile ekli bir liste oluşturabilirsiniz, ancak RecyclerView kullanmak daha kolaydır:

  1. Yukarı / aşağı kaydırırken hücreleri yeniden kullanır : Bu, ListView adaptöründe Görünüm Tutucusunun uygulanmasıyla mümkündür, ancak isteğe bağlı bir şeydi, RecycleView'da ise adaptör yazmanın varsayılan yolu.

  2. Listeyi kendi kabından ayırır: böylece LayoutManager'ı ayarlayarak liste öğelerini farklı kaplara (linearLayout, gridLayout) çalışma zamanında kolayca yerleştirebilirsiniz.

mRecyclerView = (RecyclerView) findViewById (R.id.my_recycler_view); mRecyclerView.setLayoutManager (yeni LinearLayoutManager (bu)); mRecyclerView.setLayoutManager (yeni GridLayoutManager (this, 2));

  1. Yaygın liste eylemlerini canlandırır : Animasyonlar ayrılır ve ItemAnimator'a delege edilir. RecyclerView hakkında daha fazlası var, ancak bence bu noktalar ana noktalar.

Sonuç olarak RecyclerView, kaygıların delegasyon modellerini izleyen ve kendisine yalnızca tek bir görev bırakan "liste verilerini" işlemek için daha esnek bir denetimdir - öğeleri geri dönüştürmek.


0

RecycleView kullanıyorsanız, kurulum için önce daha fazla efford'a ihtiyacınız vardır. Basit Item onclick, border, touch event ve diğer basit şeyleri kurmak için daha fazla zaman ayırmanız gerekiyor. Ancak son ürün mükemmel olacak.

Yani karar senin. Önerim, eğer basit bir öğeye tıklamanın yeterli olduğu telefon rehberi yükleme gibi basit bir uygulama tasarlarsanız, liste görünümünü uygulayabilirsiniz. Ancak sınırsız kaydırmalı sosyal medya ana sayfası gibi tasarlarsanız. Eşya arasında birkaç farklı dekorasyon, tek tek öğenin geri dönüşüm görünümünü kullanmaktan daha fazla kontrolü.

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.