Android Kotlin Fundamentals 07.5: RecyclerView'da Üstbilgiler

Bu codelab, Android Kotlin Temelleri kursuna dahildir. Codelab'ler üzerinden sırayla çalışıyorsanız bu kurstan en iyi şekilde yararlanabilirsiniz. Tüm kurs codelab'leri Android Kotlin Fundamentals codelabs açılış sayfasında listelenmektedir.

Giriş

Bu codelab'de, RecyclerView öğesinde gösterilen listenin genişliğini kapsayan bir üstbilginin nasıl ekleneceğini öğreneceksiniz. Uyku izleyici uygulamasını önceki codelab'lerden oluşturursunuz.

Bilmeniz gerekenler

  • Bir etkinlik, parçalar ve görünümler kullanarak temel kullanıcı arayüzü oluşturma.
  • Parçalar arasında gezinme ve parçalar arasında veri iletmek için safeArgs nasıl kullanılır?
  • Modelleri görüntüleyin, model fabrikalarını, dönüşümleri, LiveData ve gözlemcilerini görüntüleyin.
  • Room veritabanı oluşturma, DAO oluşturma ve varlıkları tanımlama.
  • Veritabanı etkileşimleri ve uzun süreli diğer görevler için eş yordam nasıl kullanılır?
  • Adapter, ViewHolder ve öğe düzeniyle temel bir RecyclerView nasıl uygulanır?
  • RecyclerView için veri bağlama nasıl uygulanır?
  • Verileri dönüştürmek için bağlama adaptörleri oluşturma ve kullanma.
  • GridLayoutManager nasıl kullanılır?
  • RecyclerView. içindeki öğelerin tıklama sayısını yakalama ve işleme

Neler öğreneceksiniz?

  • Farklı düzene sahip öğeler eklemek için RecyclerView ile birden fazla ViewHolder kullanma. Özellikle, RecyclerView içinde gösterilen öğelerin üst kısmına ikinci bir ViewHolder ekleme.

Yapacaklarınız

  • Bu serideki önceki codelab'den WatchMySleepquality uygulamasını temel alın.
  • Ekranın genişliği, RecyclerView ürününde görünen uyku gecelerinin üst kısmına yayılan bir başlık ekler.

Başladığınız uyku izleyici uygulamasında, aşağıdaki resimde gösterildiği gibi parçalarla temsil edilen üç ekran vardır.

Solda gösterilen ilk ekranda izlemeyi başlatmak ve durdurmak için düğmeler bulunur. Ekranda kullanıcının uyku verilerinden bazıları gösterilir. Temizle düğmesi, uygulamanın kullanıcı için topladığı tüm verileri kalıcı olarak siler. Ortadaki ekranda gösterilen ikinci ekran uyku kalitesi puanı seçmek içindir. Üçüncü ekran, kullanıcı ızgaradaki bir öğeye dokunduğunda açılan bir ayrıntılı görünümdür.

Bu uygulama; uyku verileri sağlamak için kullanıcı arayüzü denetleyicisi, görünüm modeli, LiveData ve Room veritabanıyla basitleştirilmiş bir mimari kullanır.

Bu codelab'de, görüntülenen öğeler tablosuna başlık eklersiniz. Son ana ekranınız aşağıdaki gibi görünür:

Bu codelab'de, RecyclerView içerisinde farklı düzenler kullanan öğeler eklemenin genel ilkesi öğretilmektedir. Listenizde veya ızgaranızda başlıklar olması yaygın görülen bir örnektir. Bir listede, öğe içeriğini açıklayan tek bir başlık olabilir. Bir listede, öğeleri tek bir listede gruplandırmak ve ayırmak için birden çok başlık olabilir.

RecyclerView, verileriniz veya her bir öğenin sahip olduğu düzen hakkında bilgi sahibi değildir. LayoutManager, ekrandaki öğeleri düzenler, ancak adaptör görüntülenecek verileri uyarlar ve görüntüleme sahiplerini RecyclerView için aktarır. Dolayısıyla, bağdaştırıcıda üstbilgiler oluşturmak için kodu eklersiniz.

Başlık eklemenin iki yolu

RecyclerView öğesinde, listedeki her öğe 0'dan başlayarak bir dizin numarasına karşılık gelir. Örneğin:

[Gerçek Veriler] -> [Bağdaştırıcı Görüntülemeleri]

[0: Uyku_Gecesi] -> [0: UykuGecesi]

[1: UykuGecesi] -> [1: UykuGecesi]

[2: Uyku_Gecesi] -> [2: UykuGecesi]

Bir listeye başlık eklemek için kullanabileceğiniz yöntemlerden biri, başlığınızın gösterilmesi gereken dizinleri kontrol ederek adaptörünüzü farklı bir ViewHolder kullanacak şekilde değiştirmektir. Üstbilgiyi izlemekten Adapter sorumlu olur. Örneğin, tablonun üst kısmında bir başlık göstermek için, sıfır dizine eklenmiş öğeyi sıralarken başlık için farklı bir ViewHolder döndürmeniz gerekir. Daha sonra, diğer tüm öğeler aşağıda gösterildiği gibi başlık ofsetiyle eşlenir.

[Gerçek Veriler] -> [Bağdaştırıcı Görüntülemeleri]

[0: Başlık]

[0: Uyku_Gecesi] -> [1: UykuGecesi]

[1: UykuGecesi] -> [2: UykuGecesi]

[2: Uyku_Gecesi] -> [3: UykuGecesi.

Başlık eklemenin diğer bir yolu, veri ızgaranıza ait yedek veri kümesini değiştirmektir. Gösterilmesi gereken tüm veriler bir listede depolandığından, listeyi bir başlığı temsil edecek öğeleri içerecek şekilde değiştirebilirsiniz. Bunu anlamak biraz daha kolaydır, ancak nesnelerinizi nasıl tasarlayacağınızı düşünmenizi gerektirir. Böylece farklı öğe türlerini tek bir listede birleştirebilirsiniz. Bu şekilde uygulandığında, adaptör kendisine iletilen öğeleri görüntüler. Dolayısıyla, 0. konumdaki öğe başlık, 1. konumdaki öğe ise doğrudan ekrandaki öğelerle eşlenen bir SleepNight'dir.

[Gerçek Veriler] -> [Bağdaştırıcı Görüntülemeleri]

[0: Üstbilgi] -> [0: Üstbilgi]

[1: UykuGecesi] -> [1: UykuGecesi]

[2: Uyku_Gecesi] -> [2: UykuGecesi]

[3: UykuGecesi] -> [3: UykuGecesi]

Her yöntemin avantajları ve dezavantajları vardır. Veri kümesinin değiştirilmesi bağdaştırıcı kodunun geri kalanında pek fazla değişiklik yapmaz ve veri listesini manipüle ederek başlık mantığı ekleyebilirsiniz. Öte yandan, dizinler için başlıkları kontrol ederek farklı bir ViewHolder kullanırsanız başlığın düzeni daha serbest kalır. Ayrıca, adaptörün, yedekleme verilerini değiştirmeden verilerin görünüme nasıl uyarlanacağını işleyebilmesini sağlar.

Bu codelab'de, RecyclerView öğenizi listenin başında bir başlık gösterilecek şekilde güncellersiniz. Bu durumda, uygulamanız başlık için veri öğelerinden farklı bir ViewHolder kullanır. Uygulama, hangi ViewHolder öğesinin kullanılacağını belirlemek için listenin dizinini kontrol eder.

1. Adım: DataItem sınıfı oluşturun

Öğe türünü soyutlayıp adaptörün "öğelerle" ilgilenmesini sağlamak için SleepNight veya Header'ı temsil eden bir veri sahibi sınıfı oluşturabilirsiniz. Veri kümeniz, veri sahibi öğelerinin listesi olur.

GitHub'dan başlangıç uygulamasını alabilir veya önceki codelab'de oluşturduğunuz SleepTracker uygulamasını kullanmaya devam edebilirsiniz.

  1. GitHub'dan RecyclerViewHeaders-Starter kodunu indirin. RecyclerViewHeaders-Starter dizini, bu codelab için gereken SleepTracker uygulamasının başlangıç sürümünü içerir. İsterseniz önceki kod laboratuvarına ait bitmiş uygulamanızla devam edebilirsiniz.
  2. SleepNightAdapter.kt'yi açın.
  3. SleepNightListener sınıfının altında, en üst düzeyde, bir veri öğesini temsil eden DataItem adlı sealed sınıfı tanımlayın.

    sealed sınıfı kapalı bir türü tanımlıyor. Yani bu dosyada tüm DataItem alt sınıflarının tanımlanması gerekir. Bunun sonucunda, derleyici, alt sınıf sayısını bilir. Kodunuzun başka bir bölümü, bağdaştırıcınızı bozabilecek yeni bir DataItem türü tanımlamak mümkün değildir.
sealed class DataItem {

 }
  1. DataItem sınıfının gövdesinde, farklı veri öğesi türlerini temsil eden iki sınıf tanımlayın. Birincisi SleepNightItem, yani SleepNight adlı sarmalayıcıdır ve sleepNight olarak adlandırılan tek bir değer alır. Mühürlü sınıfın bir parçası yapmak için DataItem süresini uzatın.
data class SleepNightItem(val sleepNight: SleepNight): DataItem()
  1. İkinci sınıf, başlığı temsil eden Header'dir. Bir üstbilginin gerçek verileri olmadığından, bunu object olarak bildirebilirsiniz. Yani, yalnızca Header tek bir örnek olacaktır. Yine, DataItem uzatalım.
object Header: DataItem()
  1. DataItem içinde, sınıf düzeyinde id adlı bir abstract Long özelliği tanımlayın. Adaptör, bir öğenin değişip değişmediğini ve nasıl değiştiğini belirlemek için DiffUtil kullandığında DiffItemCallback her bir öğenin kimliğini bilmesi gerekir. SleepNightItem ve Header soyut mülkü (id) geçersiz kılması gerektiğinden bir hata göreceksiniz.
abstract val id: Long
  1. SleepNightItem içinde, nightId döndürmek için id değerini geçersiz kılın.
override val id = sleepNight.nightId
  1. Header içinde, çok az sayıda (yani -2'nin 63'lük kuvveti) Long.MIN_VALUE değerini döndürmek için id değerini geçersiz kılın. Yani bu durum, mevcut herhangi bir nightId ile çelişmez.
override val id = Long.MIN_VALUE
  1. Tamamlanan kodunuz bu şekilde görünmelidir ve uygulamanız hata olmadan oluşturulmalıdır.
sealed class DataItem {
    abstract val id: Long
    data class SleepNightItem(val sleepNight: SleepNight): DataItem()      {
        override val id = sleepNight.nightId
    }

    object Header: DataItem() {
        override val id = Long.MIN_VALUE
    }
}

2. Adım: Başlık için bir ViewHolder oluşturun

  1. Başlığın düzenini, TextView gösteren header.xml adlı yeni bir düzen kaynağı dosyasında oluşturun. Bu durumun heyecan verici bir yanı yok. Kodu aşağıda görebilirsiniz.
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Sleep Results"
    android:padding="8dp" />
  1. "Sleep Results" öğesini bir dize kaynağına çıkarıp header_text olarak adlandırın.
<string name="header_text">Sleep Results</string>
  1. SleepNightAdapter.kt bölümünde, SleepNightAdapter sınıfında, ViewHolder sınıfının üzerinde yeni bir TextViewHolder sınıfı oluşturun. Bu sınıf, textview.xml düzenini şişirir ve bir TextViewHolder örneği döndürür. Bunu daha önce yaptığınız için kodu burada bulabilirsiniz. View ve R içe aktarmanız gerekir:
    class TextViewHolder(view: View): RecyclerView.ViewHolder(view) {
        companion object {
            fun from(parent: ViewGroup): TextViewHolder {
                val layoutInflater = LayoutInflater.from(parent.context)
                val view = layoutInflater.inflate(R.layout.header, parent, false)
                return TextViewHolder(view)
            }
        }
    }

3. Adım: SleepNightAdapter'ı güncelleyin

Şimdi SleepNightAdapter beyanını güncellemeniz gerekiyor. Yalnızca tek bir ViewHolder türünü desteklemek yerine, tüm görünüm sahibi türlerini kullanabilmelidir.

Öğe türlerini tanımlayın

  1. SleepNightAdapter.kt ürününde en üst düzeyde, import ifadelerinin altında ve SleepNightAdapter değerinin üzerinde, görüntüleme türleri için iki sabit değer tanımlayın.

    RecyclerView öğesinin her bir öğenin görünüm türünü ayırt etmesi gerekir. Böylece, öğe için doğru şekilde bir görünüm sahibi atayabilir.
    private val ITEM_VIEW_TYPE_HEADER = 0
    private val ITEM_VIEW_TYPE_ITEM = 1
  1. SleepNightAdapter içinde, geçerli öğenin türüne bağlı olarak doğru üst bilgiyi veya öğe sabitini döndürmek için getItemViewType() öğesini geçersiz kılacak bir işlev oluşturun.
override fun getItemViewType(position: Int): Int {
        return when (getItem(position)) {
            is DataItem.Header -> ITEM_VIEW_TYPE_HEADER
            is DataItem.SleepNightItem -> ITEM_VIEW_TYPE_ITEM
        }
    }

SleepNightAdapter tanımını güncelle

  1. SleepNightAdapter öğesinin tanımında, ListAdapter için ilk bağımsız değişkeni SleepNight yerine DataItem olarak güncelleyin.
  2. SleepNightAdapter öğesinin tanımında, ListAdapter için ikinci genel bağımsız değişkeni SleepNightAdapter.ViewHolder yerine RecyclerView.ViewHolder olarak değiştirin. Gerekli güncellemeler için bazı hatalar göreceksiniz. Sınıf başlığınız aşağıda gösterildiği gibi olmalıdır.
class SleepNightAdapter(val clickListener: SleepNightListener):
       ListAdapter<DataItem, RecyclerView.ViewHolder>(SleepNightDiffCallback()) {

onCreateViewHolder() güncellemesini güncelle

  1. RecyclerView.ViewHolder özelliğini döndürmek için onCreateViewHolder() imzasını değiştirin.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder
  1. Her öğe türü için uygun görünüm sahibini test edip döndürmek için onCreateViewHolder() yönteminin uygulamasını genişletin. Güncellenen yönteminiz aşağıdaki koda benzemelidir.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return when (viewType) {
            ITEM_VIEW_TYPE_HEADER -> TextViewHolder.from(parent)
            ITEM_VIEW_TYPE_ITEM -> ViewHolder.from(parent)
            else -> throw ClassCastException("Unknown viewType ${viewType}")
        }
    }

onConnectViewHolder() uygulamasını güncelle

  1. ViewHolder olan onBindViewHolder() parametre türünü RecyclerView.ViewHolder olarak değiştirin.
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
  1. Verileri yalnızca sahip ViewHolder ise görünüm sahibine atamak için koşul ekleyin.
        when (holder) {
            is ViewHolder -> {...}
  1. getItem() tarafından döndürülen nesne türünü DataItem.SleepNightItem hedefine yayınlayın. Tamamladığınız onBindViewHolder() işlevi aşağıdaki gibi görünecektir.
  override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (holder) {
            is ViewHolder -> {
                val nightItem = getItem(position) as DataItem.SleepNightItem
                holder.bind(nightItem.sleepNight, clickListener)
            }
        }
    }

DiffUtil geri çağırmalarını güncelleme

  1. SleepNightDiffCallback alanındaki yöntemleri, SleepNight yerine yeni DataItem sınıfınızı kullanacak şekilde değiştirin. Aşağıdaki kodda gösterildiği gibi tüy uyarısını önleyin.
class SleepNightDiffCallback : DiffUtil.ItemCallback<DataItem>() {
    override fun areItemsTheSame(oldItem: DataItem, newItem: DataItem): Boolean {
        return oldItem.id == newItem.id
    }
    @SuppressLint("DiffUtilEquals")
    override fun areContentsTheSame(oldItem: DataItem, newItem: DataItem): Boolean {
        return oldItem == newItem
    }
}

Üstbilgiyi ekleme ve gönderme

  1. SleepNightAdapter içinde, onCreateViewHolder() altında aşağıda gösterildiği gibi bir addHeaderAndSubmitList() işlevi tanımlayın. Bu işlev, SleepNight listesini alır. Listenizi göndermek için ListAdapter tarafından sağlanan submitList() yerine bu işlevi bir başlık ekleyip listeyi göndermek için kullanırsınız.
fun addHeaderAndSubmitList(list: List<SleepNight>?) {}
  1. addHeaderAndSubmitList() bölümünde, iletilen liste null ise yalnızca başlık döndürmeniz gerekir; aksi halde, başlığı listenin başına ekleyin ve ardından listeyi gönderin.
val items = when (list) {
                null -> listOf(DataItem.Header)
                else -> listOf(DataItem.Header) + list.map { DataItem.SleepNightItem(it) }
            }
submitList(items)
  1. SleepTrackerFragment.kt dosyasını açın ve submitList() çağrısını addHeaderAndSubmitList() olarak değiştirin.
  1. Uygulamanızı çalıştırın ve başlığınızın uyku öğeleri listesinde ilk öğe olarak nasıl görüntülendiğini gözlemleyin.

Bu uygulama için düzeltilmesi gereken iki şey var. Bunlardan biri görünür, biri görünmüyor.

  • Üstbilgi, sol üst köşede gösterilir ve kolayca ayırt edilemez.
  • Tek başlığı olan kısa bir liste için çok önemli değildir, ancak kullanıcı arayüzü iş parçacığındaki addHeaderAndSubmitList() öğesinde liste manipülasyonu yapmamanız gerekir. Öğelerin nereye eklenmesi gerektiğine karar vermek için yüzlerce öğe, birden fazla başlık ve mantık içeren bir liste düşünün. Bu çalışma bir eş yordamı kapsamındadır.

Kortin kullanmak için addHeaderAndSubmitList() uygulamasını değiştirin:

  1. SleepNightAdapter sınıfının en üst düzeyinde Dispatchers.Default içeren bir CoroutineScope tanımlayın.
private val adapterScope = CoroutineScope(Dispatchers.Default)
  1. addHeaderAndSubmitList() bölgesinde, listeyi değiştirmek için adapterScope içinde bir eş yordam başlatın. Ardından, aşağıdaki kodda gösterildiği gibi listeyi göndermek için Dispatchers.Main bağlamına geçin.
 fun addHeaderAndSubmitList(list: List<SleepNight>?) {
        adapterScope.launch {
            val items = when (list) {
                null -> listOf(DataItem.Header)
                else -> listOf(DataItem.Header) + list.map { DataItem.SleepNightItem(it) }
            }
            withContext(Dispatchers.Main) {
                submitList(items)
            }
        }
    }
  1. Kodunuz oluşturulmalı ve çalıştırılmalıdır. Herhangi bir fark görmezsiniz.

Şu anda başlık, ızgaradaki diğer öğelerle aynı genişliğe sahiptir ve yatay ve dikey olarak bir aralığı kaplar. Tüm ızgarada yatay olarak bir aralık genişliğinde üç öğe bulunduğu için başlıkta yatay olarak üç aralık kullanılmalıdır.

Başlık genişliğini düzeltmek için GridLayoutManager öğesini tüm sütunlar arasında ne zaman kapsamanız gerektiğini bildirmeniz gerekir. Bunu, GridLayoutManager öğesinde SpanSizeLookup öğesini yapılandırarak yapabilirsiniz. Bu, GridLayoutManager'ın listedeki her öğe için kaç aralığın kullanılacağını belirlemek üzere kullandığı bir yapılandırma nesnesidir.

  1. SleepTrackerFragment.kt dosyasını açın.
  2. onCreateView() değerinin sonuna doğru manager kodunu tanımladığınız kodu bulun.
val manager = GridLayoutManager(activity, 3)
  1. manager altında manager.spanSizeLookup gösterildiği gibi tanımlayın. setSpanSizeLookup bir lambda almadığı için object yapmanız gerekiyor. Kotlin'de object yapmak için object : classname yazın. Bu örnekte GridLayoutManager.SpanSizeLookup olacaktır.
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
}
  1. Oluşturucuyu çağırmak için derleyici hatası alabilirsiniz. Bunu yaparsanız oluşturucu çağrısını uygulamak için Option+Enter (Mac) veya Alt+Enter (Windows) ile intent menüsünü açın.
  1. Daha sonra, object üzerinde yöntemleri geçersiz kılmanız gerektiğini belirten bir hata alırsınız. İmleci object üzerine getirin, niyet menüsünü açmak için Option+Enter (Mac) veya Alt+Enter (Windows) tuşuna basın, ardından getSpanSize() yöntemini geçersiz kılın.
  1. getSpanSize() gövdesinde her konum için doğru aralık boyutunu döndürün. Konum 0'ın aralık boyutu 3. Diğer konumların aralık boyutu 1. Doldurduğunuz kod aşağıdaki koda benzemelidir:
    manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
            override fun getSpanSize(position: Int) =  when (position) {
                0 -> 3
                else -> 1
            }
        }
  1. Başlığın görünümünü iyileştirmek için header.xml dosyasını açın ve bu kodu header.xml düzen dosyasına ekleyin.
android:textColor="@color/white_text_color"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:background="@color/colorAccent"
  1. Uygulamanızı çalıştırın. Ekran görüntüsü aşağıdaki gibi olmalıdır.

Tebrikler! Tamamladınız.

Android Studio projesi: RecyclerViewHeaders

  • Başlık, genellikle bir listenin genişliğini kapsayan ve başlık ya da ayırıcı olarak işlev gören bir öğedir. Bir listede, öğe içeriğini açıklayan tek bir başlık, öğeleri gruplamak ve öğeleri birbirinden ayırmak için birden çok başlık olabilir.
  • RecyclerView, heterojen bir öğe grubunu (ör. başlıklar ve liste öğeleri) barındırmak için birden fazla görüntüleme sahibi kullanabilir.
  • Üstbilgi eklemenin yollarından biri, bağdaştırıcınızı farklı bir ViewHolder kullanacak şekilde değiştirmek için başlığınızın gösterilmesi gereken dizinleri kontrol etmektir. Adapter, başlığın takip edilmesinden sorumludur.
  • Üstbilgi eklemenin diğer bir yolu, bu codelab'de yaptığınız gibi, veri ızgaranıza ait yedek veri kümesini (liste) değiştirmektir.

Başlık eklemenin başlıca adımları aşağıda verilmiştir:

  • Başlığı veya verileri barındırabilecek bir DataItem oluşturarak listenizdeki verileri soyutlayın.
  • Adaptördeki başlık için bir düzene sahip görünüm görünümü oluşturun.
  • Adaptörü ve yöntemlerini her türlü RecyclerView.ViewHolder kullanacak şekilde güncelleyin.
  • onCreateViewHolder() öğesinde, veri öğesi için doğru görünüm sahibi türünü döndürün.
  • DataItem sınıfıyla çalışmak için SleepNightDiffCallback uygulamasını güncelleyin.
  • Üstbilgiyi veri kümesine eklemek ve ardından submitList() çağrısı yapmak için eş yordam kullanan bir addHeaderAndSubmitList() işlevi oluşturun.
  • Yalnızca üç başlık aralığını genişletmek için GridLayoutManager.SpanSizeLookup() uygulayın.

Udacity kursu:

Android geliştirici dokümanları:

Bu bölümde, bir eğitmen tarafından sunulan kurs kapsamında bu codelab üzerinden çalışan öğrenciler için olası ev ödevi ödevleri listelenmektedir. Öğretmenin şunları yapması gerekir:

  • Gerekirse ev ödevini atayın.
  • Öğrencilere ev ödevlerinin nasıl gönderileceğini bildirin.
  • Ev ödevlerine not verin.

Öğretmenler bu önerileri istedikleri kadar kullanabilir veya uygun görebilir ve uygun olan diğer ev ödevlerini atayabilirler.

Bu codelab'de kendiniz çalışıyorsanız, bilginizi test etmek için bu ödevlerden yararlanabilirsiniz.

Bu soruları yanıtlayın

1. Soru

ViewHolder ile ilgili olarak aşağıdaki ifadelerden hangisi doğrudur?

▢ Adaptör, başlıkları ve çeşitli veri türlerini tutmak için birden fazla ViewHolder sınıfı kullanabilir.

▢ Veriler için tam bir tane görünüm ve başlık için bir tane görünüm sahibiniz olabilir.

RecyclerView birden çok başlık türünü destekler, ancak veriler tek tip olmalıdır.

▢ Başlığı eklerken doğru konumu yerleştirmek için RecyclerView alt sınıfına girersiniz.

2. Soru

Korintinleri ne zaman RecyclerView ile kullanmalısınız? Doğru olan tüm ifadeleri seçin.

▢ Asla. RecyclerView bir kullanıcı arayüzü öğesidir ve eş yordam kullanmamalıdır.

▢ Kullanıcı arayüzünü yavaşlatabilecek uzun süreli görevlerde eş yordam kullanın.

▢ Liste manipülasyonları uzun sürebilir ve bunları her zaman eş yordamlar kullanarak yapmanız gerekir.

▢ Ana iş parçacığını engellememek için askıya alma işlevlerine sahip eş yordamlar kullanın.

3. Soru

Birden fazla ViewHolder kullanırken aşağıdakilerden hangisini YAPMAMANIZ GEREKİR?

ViewHolder içinde, gerektiğinde şişirmek için birden çok düzen dosyası sağlayın.

onCreateViewHolder() öğesinde veri öğesi için doğru görünüm sahibi türünü döndürün.

onBindViewHolder() ürününde verileri yalnızca görünüm sahibi veri öğesi için doğru görünüm sahibi türüyse bağlayın.

▢ Herhangi bir RecyclerView.ViewHolder kabul etmek için bağdaştırıcı sınıfı imzasını genelleştirin.

Sonraki derse başlayın: 8.1 İnternet'ten veri alma

Bu kurstaki diğer codelab'lerin bağlantılarına ulaşmak için Android Kotlin Fundamentals codelabs açılış sayfasına göz atın.