Örnek ile Android'de RecyclerView

RecyclerView nedir?

RecyclerView, GridView ve ListView'in daha esnek ve gelişmiş versiyonu olan bir pencere öğesidir. Sınırlı sayıda görünüm koruyarak verimli bir şekilde kaydırılabilen büyük veri kümelerini görüntülemek için bir kapsayıcıdır. Ağ olayına veya kullanıcı eylemine bağlı olarak çalışma zamanında öğeleri değişen veri koleksiyonlarınız olduğunda RecyclerView pencere aracını kullanabilirsiniz.

Bu eğitimde şunları öğreneceksiniz:

Görüntüleme

Android platformu, ekranda öğeler çizmek için View ve ViewGroup sınıflarını kullanır. Bu sınıflar soyuttur ve bir kullanım durumuna uyacak şekilde farklı uygulamalara genişletilir. Örneğin TextView, metin içeriğini ekranda görüntülemek gibi basit bir amaca sahiptir. EditText, aynı View sınıfından genişler ve kullanıcının veri girmesini sağlamak için daha fazla işlevsellik ekler.

Kullanıcı arayüzleri geliştirirken daha fazla esneklik elde edebilmek için kendi özel görünümlerimizi oluşturmak mümkündür. View sınıfı, ekranda çizmek için geçersiz kılabileceğimiz yöntemler ve genişlik, yükseklik ve kendi istediğimiz gibi davranmasını sağlamak için Görünümümüze eklemek istediğimiz kendi özel niteliklerimiz gibi parametreleri iletmek için bir yol sağlar.

Görünüm Grupları

ViewGroup sınıfı bir tür View'dur, ancak sorumluluğu basitçe görüntülemek olan basit View sınıfının aksine, ViewGroup bize bir bütün olarak referans verebileceğimiz birden fazla görünümü tek bir görünüme koyma yeteneği verir. Bu durumda, diğer basit görünümleri eklediğimiz (viewGroup'ları da ekleyebiliriz) en üst düzeyde oluşturulan Görünüme 'ebeveyn' denir ve içine eklenen görünümler 'alt öğelerdir'.

Bir Görünümü Dizi olarak ve bir ViewGroup'u Diziler Dizisi olarak görüntüleyebiliriz. Bir Dizi Dizisinin kendisi bir Dizi olduğu göz önüne alındığında, bir ViewGroup'un nasıl bir Görünüm gibi ele alınabileceğini görebiliriz. |_+_|

ViewGroup ayrıca çocukların manzara içinde nasıl düzenlendiğini, örneğin dikey veya yatay olarak nasıl yerleştirildiğini tanımlamamızı sağlar. Görünüm içinde etkileşim için farklı kurallarımız olabilir. Örneğin, birbirini takip eden TextView'ler 12dp, ImageView ve ardından TextView'ler 5dp mesafeye sahip olmalıdır.

Kendi ViewGroup'umuzu sıfırdan geliştiriyor olsaydık durum böyle olurdu. Bu yapılandırmaları kolaylaştırmak için Android, bu yapılandırmaları girmek için kullanabileceğimiz LayoutParams adlı bir sınıf sağlar.

Android belgeleri kendi ViewGroup'umuzu yapılandırırken uygulayacağımız bazı varsayılan parametreleri sağlar. Bazı yaygın parametreler genişlik, yükseklik ve kenar boşluğu ile ilgili olanlardır. Varsayılan olarak, bu konfigürasyonlar yükseklik için android:layout_height yapısına sahiptir, örneğin, android:layout_width Bu bağlamda, ViewGroup'unuzu oluşturduğunuzda, ViewGroup'unuzun nasıl davranmasını istediğinize özel LayoutParams da oluşturabilirsiniz.

Android, ihtiyaç duyduğumuz birçok ortak görevi yapmak için kullanabileceğimiz varsayılan Görünümler ve Görünüm Grupları ile birlikte gelir. Bahsettiğimiz bir örnek bir TextView. Bu, yükseklik, genişlik, textSize ve benzeri gibi yapılandırılabilir özelliklerle gelen basit bir görünümdür. Diğerlerinin yanı sıra, bahsettiğimiz gibi, Resimleri ve EditText'i görüntülemek için bir ImageView'ımız var. Android ayrıca, Görünümlerimizi ekleyebileceğimiz ve beklenen davranışı elde edebileceğimiz özel ViewGroup'lara sahiptir.

LinearLayout

LinearLayout, içine Görünüm öğeleri eklememize izin verir. LinearLayout, ekranda nasıl düzenleneceğini belirleyen bir yönlendirme özelliğidir. Ayrıca, içerideki görünümler için kuralları belirleyen LinearLayout.LayoutParams'a sahiptir, örneğin, android:center_horizontal niteliği görünümleri yatay eksen boyunca ortalarken, 'android:center_vertical görünümün içeriğini dikey eksen boyunca ortalar.

İşte merkezlemeyi anlamak için bazı resimler. Bunu 200 piksele 200 piksel boşluk içinde basit bir TextView olarak alırdık, merkezleme nitelikleri aşağıdaki gibi davranmasını sağlardı.

android:center_horizontal

Yatay olarak ortalanmış içerik



android:center_vertical

dikey olarak ortalanmış içerik

android:merkez

Ortalanmış içerik



RecyclerView'ın Temel Bileşenleri

RecyclerView'ın Temel Bileşenleri

RecyclerView'ın önemli bileşenleri şunlardır:

RecyclerView.Adapter

Zemin Çalışması #1 - Adaptör Modeli

Bağdaştırıcı, sistem veya cihazın niteliklerini, uyumsuz bir cihaz veya sistemin niteliklerine dönüştüren bir cihazdır. Bazıları sinyal veya güç özelliklerini değiştirirken, diğerleri sadece bir konektörün fiziksel biçimini diğerine uyarlar.

Bir Adaptörü açıklamak için gerçek hayatta bulduğumuz basit bir örnek, cihazları birbirine bağlamamız gerektiğinde, ancak birbirleriyle eşleşmeyen bağlantı bağlantı noktalarına sahip oldukları zamandır. Farklı türde prizlerin kullanıldığı farklı bir ülkeyi ziyaret ettiğinizde bu durum söz konusu olabilir. Telefonunuzu veya dizüstü şarj cihazınızı yanınızda taşıyorsanız, elektrik prizlerine takmanız imkansız olacaktır. Ancak pes etmeyecek, sadece elektrik prizi ile şarj cihazınız arasına girecek ve şarjın gerçekleşmesini sağlayacak bir Adaptör alacaksınız.

Bu, görevi yerine getirmek için iki veri yapısını birbirine bağlamak istediğimizde programlamadaki durumdur, ancak varsayılan bağlantı noktalarının birbirleriyle iletişim kurma yolu yoktur.

Basit bir cihaz ve şarj cihazı örneğini kullanacağız. İki şarj cihazı örneğimiz olacak. Bir Amerikalı ve bir İngiliz |__+_|

Daha sonra iki cihaz oluşturacağız |_+_|

Örnek olarak, birlikte oynamak için cihazların bazı örneklerini oluşturabiliriz. |_+_|

Ardından, Charge() adlı cihazlara bir yöntem ekleyerek her iki cihaz için de şarj etme kavramını tanıtacağız.

Yöntem, ilgili şarj cihazını girdi olarak alır ve buna göre şarj eder. |_+_|

Bu durumda, analojimize dayanarak, bir Amerikan Cihazı kullanırken şu veya bu nedenle bir BritishCharger kullanmaya ihtiyaç duyacağız veya tam tersi.

Programlama dünyasında, bu genellikle aynı işlevselliği sunan kitaplıkları bir araya getirirken olur (bizim bağlamımızda, paylaşılan işlevselliğimiz ücretlendirmedir). Bunu etkinleştirmenin bir yolunu bulmamız gerekecek.

Analojiyi takip edersek, bir elektronik mağazasına gitmemiz ve BritishChargers verilen Amerikan Cihazlarını şarj etmemizi sağlayacak bir adaptör satın almamız gerekecek. Programlama açısından, adaptörün üreticisi biz olacağız.

Biri için, diğerini oluşturmak için ihtiyaç duyacağımız kalıba tam olarak uyan bir Adaptör yapacağız. Aşağıdaki gibi bir sınıf olarak uygulayacağız. Mutlaka bir sınıf olması gerekmez ve adaptör modelinin genel olarak ne yaptığını vurgulayan bir işlev olabilir. Android'deki çoğu kullanımla eşleştiği için bir sınıf kullanacağız. |_+_|

Programlama dünyasında, soketlerdeki fark, şarj için kullanılan yöntemlerin içindeki farka benzer. Farklı yöntemlere sahip olan şarj cihazları, şarj cihazlarını kullanmayı imkansız hale getirecektir. |_+_|

AmericanChargerIFound ile myBritishDevice'de Charge() yöntemini çağırmaya çalışmak, AmericanDevice yalnızca bir AmericanCharger'ı kabul ettiğinden işe yaramaz

Yani bunu yapmak imkansız |__+_|

Bu senaryoda oluşturduğumuz bağdaştırıcı

AmericanToBritishChargerAdapter artık kullanışlı olabilir. Şarj etmek için kullanabileceğimiz yeni bir BritishCharger oluşturmak için returnNewCharger() yöntemini kullanabiliriz. Tek ihtiyacımız olan, adaptörümüzün bir örneğini oluşturmak ve onu sahip olduğumuz AmericanCharger ile beslemek ve bu, kullanabileceğimiz bir BritishCharger oluşturacaktır |_+_|

RecyclerView.LayoutManager

Bir ViewGroup ile uğraşırken, içine Views yerleştirilmiş olurdu. LayoutManager, Görünümlerin içeride nasıl düzenlendiğini açıklama görevine sahip olacaktır.

Karşılaştırma amacıyla, Linearlayout ViewGroup ile çalışırken istediğimiz kullanım durumu, öğeleri dikey veya yatay olarak yerleştirme yeteneğidir. Bu, bize lineerlayout'un ekrana nasıl yerleştirileceğini söyleyen bir oryantasyon özniteliği ekleyerek kolayca uygulanabilir. Bunu |_+_| kullanarak yapabiliriz. bağlanmak.

Ayrıca GridLayout adında başka bir ViewGroup'umuz var, kullanım durumu, Görünümleri dikdörtgen bir Izgara yapısına yerleştirmek istediğimiz zamandır. Bunun nedeni, uygulama kullanıcısına sunduğumuz verileri tüketmeyi kolaylaştırmak gibi nedenlerle olabilir. Tasarım gereği, GridLayout, örneğin ızgaranın boyutlarını tanımlayabileceğimiz konfigürasyonlara sahip olarak bu hedefe ulaşmanıza yardımcı olacak konfigürasyonları sağlar, örneğin 4x4 ızgara, 3 x 2 ızgara olabilir.

RecyclerView.ViewHolder

ViewHolder, RecyclerView'dan da genişlettiğimiz soyut bir sınıftır. ViewHolder, RecyclerView'daki Geri Dönüşüm makineleri bilmediğimiz çeşitli referansları değiştirdikten sonra bile RecyclerView'a yerleştirdiğimiz bir Görünüme başvurmamıza yardımcı olacak ortak yöntemler sağlar.

Büyük Listeler

RecyclerView'lar, oluşturulan Görünümün her bir örneği için cihazımızdaki RAM'imizi tüketmeden, kullanıcıya gerçekten büyük bir Görünüm kümesi sunmak istediğimizde kullanılır.

Bir Kişi Listesini ele alacak olsaydık, bir kişinin listede nasıl görüneceğine dair genel bir fikrimiz olurdu. O zaman yapacağımız şey, kişi listemizdeki çeşitli verilerin doldurulacağı yuvalarla - aslında bir Görünüm olan - bir şablon düzeni oluşturmaktır. Aşağıda, tüm amacı açıklayan bir sözde kod verilmiştir: |__+_|

O zaman bu nitelikte bir İletişim Listemiz olurdu |__+_|

Durum buysa, içeriği sabit kodluyorduk, uygulamayı yeniden yazmadan listeye yeni içerik eklemenin programlı bir yolu olmazdı. Neyse ki bizim için. Bir Görünüm Grubuna Görünüm Ekleme |_+_| yöntem.

Durum böyle olsa bile, RecyclerView bu şekilde çocuk görüşlerinin eklenmesini sağlamaz.

Kullanım durumumuzda, uzun bir irtibat listemiz olurdu. Listedeki her kişi için OneContactView oluşturmamız ve Contact sınıfımızdaki alanlarla eşleşmesi için Görünüm içindeki verileri doldurmamız gerekir. Ardından, görünüme sahip olduğumuzda, listeyi göstermek için onu RecyclerView'a eklememiz gerekecek. |_+_|

OneContactView adında bir dizi kişimiz var. Contact sınıfından içerik almak ve bunları görüntülemek için yuvalar içerir. RecyclerView'da, geri dönüşüm yeteneğinde bize yardımcı olabilmesi için içine Görünümler eklemeliyiz.

RecyclerView gerçekten görünüm eklememize izin vermiyor, ancak bir ViewHolder eklememize izin veriyor. Yani, bu senaryoda, bağlamak istediğimiz ancak eşleşmeyen iki parçamız var. Bağdaştırıcımızın devreye girdiği yer burasıdır. RecyclerView bize |_+_| Bu, daha önce BritishDevice cihazımızda kullanılamayan AmericanCharger cihazımızı, gerçek hayatta güç adaptörüne benzer, kullanılabilir bir şeye dönüştürmemizi sağladı.

Bu senaryoda, bağdaştırıcı Kişi dizimizi ve Görünümümüzü alır ve oradan RecyclerView'ın kabul etmeye istekli olduğu ViewHolders oluşturur.

RecyclerView, RecyclerView.Adapter sınıfı aracılığıyla Adapter'ımızı oluşturmak için genişletebileceğimiz bir arabirim sağlar. Bu Bağdaştırıcının içinde, RecyclerView'ın birlikte çalışmak istediği ViewHolder sınıfını oluşturmanın bir yolu vardır. Yani, elimizdeki durum öncekiyle aynı, ancak ekstra bir şey daha var, o da Adaptör.

Bir Kişiler dizisine sahibiz, bir kişiyi OneContactView görüntülemek için bir görünüm. Bir RecyclerView, geri dönüşüm hizmetleri sağlayan ancak yalnızca ViewHolders'ı almaya istekli Görünümlerin bir listesidir.

Ancak bu senaryoda, içinde ViewHolders oluşturma yöntemi olan RecyclerView.Adapter sınıfına sahibiz. |_+_|

RecyclerView.ViewHolder, Görünümümüzü bir argüman olarak alan ve onu bir ViewHolder'a dönüştüren soyut bir sınıftır.

Sınıfların yeteneklerini genişletmek için kullanılan sarmalayıcı desenini kullanır.

Zemin Çalışması #2 - Sarıcı desen

Hayvanları nasıl konuşturabileceğimizi göstermek için basit bir örnek kullanacağız. |_+_|

Yukarıdaki örnekte iki hayvanımız var. Şans eseri, konuşmayı sağlamak için bir yöntem eklemek isteseydik, ancak kütüphane yazarı eğlenceli değilse, yine de bir yol bulabilirdik. İhtiyacımız olan şey Animal sınıfımız için bir sarmalayıcı olurdu. Bunu |_+_| sınıfımız için Animal'ı kurucu olarak alarak yapardık.

Şimdi bir hayvan örneğinde SpeechPoweredAnimalByWrapper'a geçebiliriz. Üzerinde sound() yöntemini çağırmak, geçirilen in animal sound() yöntemini çağırır. Ayrıca, aktarılan hayvanlara eklediğimiz yeni işlevsellik sayılan ek bir talk() yöntemimiz var. Bunu aşağıdaki gibi kullanabiliriz: |_+_|

Bu kalıbı kullanarak sınıfları alabilir ve işlevsellik ekleyebiliriz. Tek ihtiyacımız olan, bir sınıf örneği ve sarma sınıfımız tarafından tanımlanan yeni yöntemlerdir.

Yukarıdaki durumumuzda somut bir sınıf kullandık. Aynı şeyi bir Soyut sınıfta uygulamak da mümkündür. SpeechPoweredAnimalByWrapper sınıfını soyut olarak değiştirmemiz gerekiyor ve işimiz bitti. Daha okunabilir hale getirmek için sınıf adını daha kısa bir adla değiştireceğiz. |_+_|

Daha önce olduğu gibi, ama başka bir anlama gelebilir. Normal bir sınıfta, cat1 ve dog1'i yarattığımız şekilde bir sınıfın örneğine sahip olabiliriz. Bununla birlikte, soyut sınıfların somutlaştırılması değil, diğer sınıfları genişletmesi amaçlanmıştır. Peki yeni SpeechPowered(var myAnimal:Animal) soyut sınıfını nasıl kullanırdık. Onu genişletecek ve işlevsellik kazandıracak yeni sınıflar oluşturarak kullanabiliriz.

Örneğimizde, |_+_| sınıfını genişleten bir SpeechPoweredAnimal sınıfı oluşturacağız. |_+_|

Bu, ViewHolder'da kullanılan modelin aynısıdır. RecyclerView.ViewHolder sınıfı, hayvanlara konuşma yöntemini eklediğimiz gibi, Görünüme işlevsellik ekleyen soyut bir sınıftır. Eklenen işlevsellik, RecyclerView ile uğraşırken çalışmasını sağlayan şeydir.

OneContactView'den bir OneContactViewHolder'ı bu şekilde oluştururduk |_+_|

RecyclerView, Contacts dizimizi RecyclerView ile ContactsView'a bağlamamıza izin veren bir Adaptöre sahiptir.

Görünüm Ekleme

ViewGroup, ViewGroup'u otomatik olarak yeniden çizmez, ancak belirli bir programı takip eder. Cihazınızda her 10ms veya 100ms'de bir yeniden çiziyor olabilir veya bir ViewGroup'a bir Görünüm eklediğimizde 1 dakika diyelim saçma bir sayı seçersek, değişiklikleri 1 dakika sonra ViewGroup 'yenilendiğinde' görürsünüz.

Geri Dönüşüm Görünümü.Geri Dönüşüm

Zemin çalışması #3. Önbelleğe almak

Düzenli olarak yenileme yaptığımız yerlerin en iyi örneklerinden biri Tarayıcıdır. Örneğin, ziyaret ettiğimiz sitenin statik olduğunu ve dinamik olarak içerik göndermediğini düşünelim, değişiklikleri görmek için sürekli yenilememiz gerekir.

Bu örnek için söz konusu sitenin twitter olduğunu düşünelim. Listelenen bir dizi statik tweet olurdu ve yeni Tweetleri görmenin tek yolu, içeriği yeniden getirmek için yenile düğmesine tıklamak olurdu.

Tüm ekranı yeniden boyamak açıkçası maliyetli bir iştir. Durumun böyle olduğunu hayal edersek, telefon sağlayıcımızla sınırlı bant genişliğimiz vardı. Ve tweet listemizde çok sayıda resim ve video vardı, her yenilemede sayfanın tüm içeriğini yeniden indirmek maliyetli olurdu.

Halihazırda yüklenmiş Tweetleri depolamak ve bir sonraki isteğimizin zaten sahip olduğu Tweetleri söyleyebilmesini sağlamak için bir yola ihtiyacımız var. Bu nedenle, her şeyi yeniden indirmez ve yalnızca sahip olduğu yeni Tweetleri alır ve ayrıca yerel olarak silebilmesi için yerel olarak kaydedilmiş bazı Tweetlerin artık orada olup olmadığını kontrol eder. Tanımladığımız şeye Önbelleğe Alma denir.

Sahip olduğumuz içerikler hakkında web sitesine gönderdiğimiz bilgilere meta-veri denir. Yani gerçek anlamda sadece 'sitenizi yüklemek istiyoruz' demiyoruz, 'sitenizi yüklemek istiyoruz' diyoruz ve işte en son yüklediğimizden beri kaydettiğimiz içeriklerden bazıları, lütfen bunu kullanmak için kullanın. bize sadece orada olmayanları gönderin, bu yüzden çok fazla kaynağımız olmadığı için çok fazla bant genişliği kullanmıyoruz.'

Düzen Çağrıları - Tweet Listesi çılgın olmalı

Bir düzen çağrısı örneği, scrollToPosition'dır.

Bu, sohbet uygulamaları gibi şeylerde bulunan yaygın bir örnektir. Bir sohbet dizisindeki biri daha önceki bir sohbet balonuna yanıt verirse, bazı sohbet uygulamaları yanıt ve tıkladığınızda sizi orijinal mesajınızın olduğu yere yönlendiren sohbet balonuna bir bağlantı içerir.

Bu durumda, RecyclerView'ımıza bir LayoutManager eklenmeden ve bir RecyclerView.Adapter'a sahip olmadan önce bu yöntemi çağırırız, scrollToPosition(n:Int) basitçe yok sayılır.

RecyclerView Bileşenleri arasındaki iletişim

4. temel. Geri aramalar

RecyclerView işini yaparken birçok hareketli parçaya sahiptir. Görünümleri Doğrusal veya Izgarada nasıl düzenleyeceğimizi söyleyen LayoutManager ile ilgilenmesi gerekiyor. ContactList öğelerimizi Views OneContactView'e ve ardından ViewHolders OneContactViewHolder'a dönüştürme işini yapan ve RecyclerView'ın bize sağladığı yöntemler dahilinde çalışmaya istekli olduğu bir Adaptörle ilgilenmesi gerekir.

RecyclerView'ın ham maddesi Görüşlerimizdir, ör. OneContactView ve veri kaynağı. |_+_|

RecyclerView'ın neyi başarmaya çalıştığını anlamak için başlangıç ​​noktası olarak basit bir senaryo kullandık.

Kullanıcıya göstermek istediğimiz 1000 kişiden oluşan statik bir diziye sahip olacağımızın temel durumu, anlaşılması kolaydır.

RecyclerView makineleri, liste artık statik olmadığında gerçekten canlanmaya başlar.

Dinamik bir liste ile, listeye bir öğe eklediğimizde veya listeden bir öğeyi kaldırdığımızda ekrandaki Görünüme ne olduğunu düşünmemiz gerekir.

RecyclerView.LayoutManager

Görüşlerimizin Doğrusal veya Izgarada nasıl düzenleneceğine karar vermenin dışında. LayoutManager, Recycler'ın Geri Dönüşümü ne zaman yapacağını bilmesine yardımcı olmak için kaputun altında pek çok iş yapar.

Şu anda Ekranda görünen Görünümleri takip etmekten ve bu bilgileri Geri Dönüşüm mekanizmasına iletmekten sorumludur. Kullanıcı aşağı kaydırdıkça, Düzen yöneticisi, en üstte odak dışında kalan Görünümleri Geri Dönüşüm sistemini bilgilendirmekle sorumludur, böylece bunlar orada kalmak yerine yeniden kullanılabilirler ve hafıza tüketirler veya onları yok etmek ve oluşturmak zorunda kalmak yerine. Yeni olanlar.

Bunun anlamı, LayoutManager'ın, listemizi kaydırırken kullanıcının nerede olduğunu takip etmesi gerektiğidir. Bunu, dizin tabanlı konumların bir listesine sahip olarak yapar, yani ilk öğe 0'dan başlamak ve listemizdeki öğe sayısına uyacak şekilde artırmaktır.

Diyelim ki 100 olan listemizdeki 10 öğeyi görüntüleyebilirsek, başlangıçta, LayoutManager odak görünümü-0'ın Görünüm-9'a kadar olduğunun farkındadır Biz kaydırdıkça LayoutManager dışarı çıkan görünümleri hesaplayabilir odak noktası.

LayoutManager, bu görünümleri yeniden kullanılabilecekleri şekilde Geri Dönüşüm mekanizmasına bırakabilir (yeni veriler bunlara bağlanabilir, örneğin bir Görünümün iletişim verileri kaldırılabilir ve sonraki segmentteki yeni Kişi verileri yer tutucuların yerini alabilir).

Elimizdeki Liste statik ise bu mutlu bir durum olabilir, ancak bir RecyclerView kullanmanın en yaygın kullanım durumlarından biri, verilerin çevrimiçi bir uç noktadan veya hatta bir Sensörden gelebileceği dinamik listelerdir. Yalnızca veriler eklenmekle kalmaz, Listemizdeki veriler bazen kaldırılır veya güncellenir.

Verilerimizin dinamik durumu, LayoutManager hakkında akıl yürütmeyi çok zorlaştırabilir. Bu nedenle, LayoutManager, Geri Dönüşüm bileşeninin kullandığı Listeden ayrı olarak, öğeler ve konumlar hakkında kendine ait bir liste tutar. Bu, yerleşim işini doğru şekilde yapmasını sağlar.

Aynı zamanda, RecyclerView'ın LayoutManager'ı sahip olduğu verileri yanlış tanıtmak istemez. Doğru çalışması için LayoutManager, RecyclerView.Adapter ile belirli aralıklarla (60ms) senkronize olur ve Liste öğelerimiz hakkında bilgi paylaşır. yani, eklenen, güncellenen, kaldırılan, bir konumdan diğerine taşınan öğeler). LayoutManager, bu bilgiyi aldıktan sonra, gerektiğinde değişikliklerle eşleşecek şekilde Ekrandaki içerikleri yeniden düzenler.

RecylerView ile ilgili temel işlemlerin çoğu, bazen statik veya bazen dinamik veri listelerimizi depolayan RecyclerView.LayoutManager ve RecyclerView.Adapter arasındaki iletişim etrafında döner.

Dahası, RecyclerView bize RecyclerView.Adapter'ımız Listemizdeki içeriği bağladığında onBindViewHolder gibi olayları dinlemek için kullanabileceğimiz yöntemler sunar, örn. Bilgileri artık Ekranda görüntülemeye alışması için bir ViewHolder'a Kişi.

Bir diğeri onCreateViewHolder, RecyclerView.The adaptörünün ne zaman OneContactView gibi normal bir Görünüm aldığını ve onu RecyclerView'ın çalışabileceği bir ViewHolder öğesine dönüştürdüğünü söyleyen onCreateViewHolder'dır. RecyclerView tarafından kullanılmak üzere ViewHolder'ımızdan. onViewDetached

Geri Dönüşümü sağlayan temel mekanizmalar dışında. RecyclerView, Geri Dönüşümü etkilemeden davranışı özelleştirmenin yollarını sağlar.

Görünümlerin Yeniden Kullanımı, onClick olaylarına tepki vermek gibi statik görünümlerle yapmaya alışık olduğumuz yaygın şeyleri yapmayı zorlaştırır.

Bildiğimiz gibi |__+_| Kullanıcıya Görünümleri sunan, bir an için |_+_| bir veritabanında sakladığımız veya bir kaynaktan aktardığımız listeye sahip olan. OnClick olaylarını doğrudan Görünümlere koymak, yanlış kişinin silinmesi veya değiştirilmesi gibi beklenmeyen davranışlara yol açabilir.

kepçe

RecyclerView kullanmak istiyorsak, bunu build .gradle dosyamıza bir bağımlılık olarak eklememiz gerekiyor.

Aşağıdaki örnekte, bu makaledeki en güncel sürüm olan 'androidx.recyclerview:recyclerview:1.1.0' uygulamasını kullandık.

Bağımlılığı Gradle dosyamıza ekledikten sonra, Android Studio tarafından değişiklikleri senkronize etmemiz istenecek,

Gradle dosyamız, yalnızca varsayılanlarla boş bir projeye bir RecyclerView ekledikten sonra böyle görünecek. |_+_|

Şu anda sadece bir düzen dosyamız var. Ekranda meyve adlarının bir listesini göstermek için bir RecyclerView kullanacağımız basit bir örnekle başlayacağız.

Eşyaların listesi

MainActivity dosyamıza gideceğiz ve kurulum sırasında oluşturulan onCreate() yönteminden hemen önce içinde meyve isimleri olan bir dizi oluşturacağız. |_+_|

Bir sonraki hedefimiz bu listeyi bir RecyclerView kullanarak ekranda sunmak olacaktır.

Bunu yapmak için, Düzenlerimizi içeren düzen dizinine gideceğiz ve bir meyve göstermekten sorumlu olacak bir Görünüm oluşturacağız.

Listemizdeki her öğe için kullanılacak düzen

android:orientation=VERTICAL|HORIZONTAL

Yukarıdaki TextView'da, bir Görünümü tanımlamak için kullanılacak bir id alanı ekledik.

Varsayılan olarak oluşturulmaz. Buna bağlı olacak verilerle eşleşmesi için meyveAdı kimliğine sahip TextView'umuz var.

RecyclerView'ı ana düzene ekleme

Aynı aktivitede, varsayılan olarak bizim için oluşturulmuş main_layout.xml layout dosyası var.

Boş bir proje seçersek. Bir ConstraintLayout içeren bir XML oluşturmuş olacak ve içinde 'Merhaba' metni olan bir TextView olacaktır.

Tüm içeriği sileceğiz ve düzenin yalnızca aşağıdaki gibi RecyclerView'ı içermesini sağlayacağız: |_+_|

Ayrıca, kodumuzda referans vermek için kullanacağımız RecyclerView için bir id niteliği ekledik. |_+_|

Daha sonra MainActivity dosyamıza geri döneceğiz. Oluşturduğumuz id'leri kullanarak, yeni oluşturduğumuz View'lere referans verebileceğiz.

Android tarafından sağlanan findViewById() yöntemini kullanarak RecyclerView'a başvurarak başlayacağız. Bunu onCreate() metodumuzda yapacağız.

onCreate() metodumuz aşağıdaki gibi görünecektir. |_+_|

Bir ViewHolder oluşturun

Ardından, Görünümümüzü almaktan ve onu RecyclerView'ın öğelerimizi görüntülemek için kullandığı bir ViewHolder'a dönüştürmekten sorumlu olan bir RecyclerView.ViewHolder oluşturacağız.

Bunu eğlenceli onCreate() yöntemimizden hemen sonra yapacağız. |_+_|

Bir RecyclerViewAdapter oluşturun

Ardından, RecyclerView.Adapter sınıfını genişleten bir FruitArrayAdapter sınıfı oluşturacağız.

Oluşturduğumuz FruitArrayAdapter aşağıdakileri yapmaktan sorumlu olacaktır.

Meyve dizisinden meyve isimlerini alacaktır. one_fruit_view.xml görünümümüzü kullanarak bir ViewHolder oluşturacak Daha sonra meyveyi bir ViewHolder'a bağlayacak ve içeriği dinamik olarak one_fruit_view.xml oluşturduğumuz Görünüm'e bağlayacaktır. |_+_|

Android Studio, FruitArrayAdapter'ımıza kırmızı dalgalı çizgiler ekleyerek, dizimizi RecyclerView'ın kullanabileceği bir ViewHolder'a bağlamak için RecyclerView'ın kullanabileceği bir yöntem uygulamamız gerektiğini söyler. |_+_|

Üretilen kodun en kolay bitiyle başlayacağız, getItemCount() yöntemidir. array.length yöntemini çağırarak dizimizdeki öğelerin sayısını nasıl alacağımızı biliyoruz. |_+_|

Ardından, eğlenceli geçersiz kılma yöntemini onCreateViewHolder üzerinde uygulayacağız.

Burası RecyclerView'ın bizden bir FruitHolder oluşturmasına yardım etmemizi istediği yer.

Hatırlarsak, FruitViewHolder sınıfımız şöyle görünüyordu: |_+_|

Bir xml dosyası olarak oluşturduğumuz meyve Görünümümüzü gerektirir one_fruit_view.xml

Bu xml'e referans oluşturup aşağıdaki gibi View'a çevirebiliriz. |_+_|

Kalan bit, geçersiz kılma |_+_|

RecyclerView.Adapter, listemizden bir öğe almak için kullanacağımız bir konum tamsayısıyla sorar. Ayrıca, FruitArray'den aldığımız öğeyi, görünüm tutucunun içinde tutulan Görünüm'e bağlayabilmemiz için bize bir tutucu sağlar.

Bir ViewHoder içinde tutulan Görünüme, ViewHolder.itemView alanından erişilebilir. Görünümü elde ettikten sonra, içeriği ayarlamak için daha önce oluşturduğumuz meyveAdı kimliğini kullanabiliriz. |_+_|

Bununla FruitArrayAdapter'ımız tamamlandı ve aşağıdaki gibi görünüyor. |_+_|

Son olarak, RecyclerView'ımızın kalan parçalarını bağlamaya hazırız. RecyclerView'a listenin içeriğinin nasıl görüntüleneceğini söyleyen bir LayoutManager oluşturanlar. LinearLayoutManager kullanılarak doğrusal bir şekilde veya GridLayoutManager veya StaggeredGridLayoutManager kullanılarak bir ızgarada gösterilip gösterilmeyeceği.

Düzen Yöneticisi Oluştur

onCreate işlevimize geri döneceğiz ve LayoutManager |_+_|

Adaptörümüzü öğelere bağlayın ve RecyclerView'a ayarlayın

addView(view:View)

Ayrıca bir meyveListAdapter örneği oluşturduk ve onu meyve isimleri dizisiyle besledik.

Ve temelde, hepimiz bittik.

MainActivity.kt dosyasının tamamı aşağıdaki gibi görünür. |_+_|

Projeyi İndirin