Android Kotlin Hakkında Temel Bilgiler 07.5: RecyclerView'da Başlıklar

Bu codelab, Android Kotlin Hakkında Temel Bilgiler kursunun bir parçasıdır. Bu kurstan en iyi şekilde yararlanmak için codelab'leri sırayla tamamlamanızı öneririz. Kursla ilgili tüm codelab'ler Android Kotlin Hakkında Temel Bilgiler codelab'leri açılış sayfasında listelenir.

Giriş

Bu codelab'de, RecyclerView içinde gösterilen listenin genişliğini kapsayan bir üstbilgi eklemeyi öğreneceksiniz. Önceki codelab'lerdeki uyku izleme uygulamasını temel alırsınız.

Bilmeniz gerekenler

  • Etkinlik, parçalar ve görünümler kullanarak temel bir kullanıcı arayüzü oluşturma
  • Parçalar arasında gezinme ve parçalar arasında veri aktarmak için safeArgs kullanma
  • Modelleri, model fabrikalarını, dönüşümleri ve LiveData ile gözlemcilerini görüntüleyin.
  • Room veritabanı oluşturma, DAO oluşturma ve varlıkları tanımlama
  • Veritabanı etkileşimleri ve uzun süren diğer görevler için eş yordamları kullanma
  • 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 öğelerde tıklamaları yakalama ve işleme

Neler öğreneceksiniz?

  • Farklı düzene sahip öğeler eklemek için RecyclerView ile birden fazla ViewHolder öğesini kullanma Özellikle, ViewHolder öğesini kullanarak RecyclerView içinde gösterilen öğelerin üzerine nasıl başlık ekleneceği.

Yapacaklarınız

  • Bu serideki önceki codelab'de yer alan TrackMySleepQuality uygulamasını temel alın.
  • RecyclerView içinde gösterilen uyku gecelerinin üstünde, ekranın genişliğini kaplayan bir başlık ekleyin.

Başlangıçta kullandığınız uyku izleme uygulamasının, aşağıdaki şekilde gösterildiği gibi parçalarla temsil edilen üç ekranı vardır.

Solda gösterilen ilk ekranda izlemeyi başlatma ve durdurma düğmeleri 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. Ortada gösterilen ikinci ekranda uyku kalitesi puanı seçilir. Üçüncü ekran, kullanıcı ızgaradaki bir öğeye dokunduğunda açılan ayrıntı görünümüdür.

Bu uygulama, uyku verilerini kalıcı hale getirmek için kullanıcı arayüzü denetleyicisi, görünüm modeli ve LiveData ile Room veritabanının yer aldığı basitleştirilmiş bir mimari kullanır.

Bu codelab'de, görüntülenen öğe ızgarasına bir başlık ekleyeceksiniz. Son ana ekranınız şu şekilde görünür:

Bu codelab'de, farklı düzenler kullanan öğeleri RecyclerView içine dahil etmenin genel prensibi öğretilmektedir. Listenizde veya tablonuzda başlıklar olması yaygın 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 fazla başlık da olabilir.

RecyclerView, verileriniz veya her öğenin düzen türü hakkında hiçbir şey bilmez. LayoutManager, ekrandaki öğeleri düzenler ancak bağdaştırıcı, verileri görüntülenecek şekilde uyarlar ve görünüm tutucuları RecyclerView'ye iletir. Bu nedenle, bağdaştırıcıda başlık oluşturmak için kodu ekleyeceksiniz.

Üstbilgi eklemenin iki yolu vardır.

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

[Gerçek Veriler] -> [Adaptör Görüntülemeleri]

[0: SleepNight] -> [0: SleepNight]

[1: SleepNight] -> [1: SleepNight]

[2: SleepNight] -> [2: SleepNight]

Bir listeye başlık eklemenin bir yolu, başlığınızın gösterilmesi gereken dizinleri kontrol ederek bağdaştırıcınızı farklı bir ViewHolder kullanacak şekilde değiştirmektir. Adapter, başlığı takip etmekten sorumlu olacaktır. Örneğin, tablonun üst kısmında bir başlık göstermek için sıfır tabanlı öğeyi düzenlerken başlık için farklı bir ViewHolder döndürmeniz gerekir. Ardından, diğer tüm öğeler aşağıda gösterildiği gibi başlık ofsetiyle eşlenir.

[Gerçek Veriler] -> [Adaptör Görüntülemeleri]

[0: Header]

[0: SleepNight] -> [1: SleepNight]

[1: SleepNight] -> [2: SleepNight]

[2: SleepNight] -> [3: SleepNight.

Başlık eklemenin bir diğer yolu da veri ızgaranızın temel alınan veri kümesini değiştirmektir. Gösterilmesi gereken tüm veriler bir listede saklandığından, listeyi başlığı temsil eden öğeleri içerecek şekilde değiştirebilirsiniz. Bu yöntemi anlamak biraz daha kolaydır ancak farklı öğe türlerini tek bir listede birleştirebilmek için nesnelerinizi nasıl tasarladığınızı düşünmeniz gerekir. Bu şekilde uygulandığında bağdaştırıcı, kendisine iletilen öğeleri gösterir. Bu nedenle, 0 konumundaki öğe bir başlık, 1 konumundaki öğe ise ekrandakiyle doğrudan eşlenen bir SleepNight.

[Gerçek Veriler] -> [Adaptör Görüntülemeleri]

[0: Header] -> [0: Header]

[1: SleepNight] -> [1: SleepNight]

[2: SleepNight] -> [2: SleepNight]

[3: SleepNight] -> [3: SleepNight]

Her metodolojinin avantajları ve dezavantajları vardır. Veri kümesini değiştirmek, bağdaştırıcı kodunun geri kalanında çok fazla değişikliğe neden olmaz ve veri listesini değiştirerek başlık mantığı ekleyebilirsiniz. Öte yandan, başlıklar için dizinleri kontrol ederek farklı bir ViewHolder kullanmak, başlığın düzeni konusunda daha fazla özgürlük sağlar. Ayrıca, temel verileri değiştirmeden verilerin görünüme nasıl uyarlanacağını bağdaştırıcının işlemesine de olanak tanır.

Bu codelab'de, listenin başında bir başlık göstermek için RecyclerView öğenizi güncelleyeceksiniz. 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ü soyutlamak ve bağdaştırıcının yalnızca "öğelerle" ilgilenmesini sağlamak için SleepNight veya Header öğesini temsil eden bir veri tutucu sınıfı oluşturabilirsiniz. Veri kümeniz, veri sahibi öğelerinin bir listesi olur.

Başlangıç uygulamasını GitHub'dan edinebilir 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 codelab'de tamamladığınız uygulamanızı da kullanabilirsiniz.
  2. SleepNightAdapter.kt dosyasını açın.
  3. SleepNightListener sınıfının altında, en üst düzeyde DataItem adlı bir sealed sınıfı tanımlayın. Bu sınıf, bir veri öğesini temsil eder.

    Bir sealed sınıfı, kapalı bir türü tanımlar. Bu, DataItem alt sınıflarının tamamının bu dosyada tanımlanması gerektiği anlamına gelir. Bu nedenle, alt sınıfların sayısı derleyici tarafından bilinir. Kodunuzun başka bir bölümünün, bağdaştırıcınızı bozabilecek yeni bir DataItem türü tanımlaması mümkün değildir.
sealed class DataItem {

 }
  1. DataItem sınıfının gövdesinde, farklı türlerdeki veri öğelerini temsil eden iki sınıf tanımlayın. İlki, SleepNightItem. Bu, SleepNight öğesinin sarmalayıcısıdır ve sleepNight adlı tek bir değer alır. Sınıfın bir parçası olması için DataItem ile genişletin.
data class SleepNightItem(val sleepNight: SleepNight): DataItem()
  1. İkinci sınıf, başlığı temsil eden Header'dır. Başlıkta gerçek veri olmadığından bunu object olarak bildirebilirsiniz. Yani Header öğesinin yalnızca bir örneği olacaktır. Tekrar uzatmasını isteyin DataItem.
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 öğenin kimliğini bilmelidir. SleepNightItem ve Header, id soyut özelliğini geçersiz kılması gerektiğinden hata görürsünüz.
abstract val id: Long
  1. SleepNightItem içinde nightId değerini döndürmek için id değerini geçersiz kılın.
override val id = sleepNight.nightId
  1. Header içinde, id değerini geçersiz kılarak Long.MIN_VALUE değerini döndürün. Bu değer çok çok küçük bir sayıdır (kelimenin tam anlamıyla -2 üzeri 63). Bu nedenle, hiçbir zaman mevcut nightId ile çakışmaz.
override val id = Long.MIN_VALUE
  1. Tamamlanmış kodunuz aşağıdaki gibi görünmeli ve uygulamanız hatasız bir şekilde 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. TextView simgesini gösteren header.xml adlı yeni bir düzen kaynağı dosyasında üstbilgi için düzen oluşturun. Bu konuda heyecan verici bir şey yok. İşte kod:
<?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 ayıklayın ve header_text olarak adlandırın.
<string name="header_text">Sleep Results</string>
  1. SleepNightAdapter.kt dosyasında, SleepNightAdapter içinde, ViewHolder sınıfının üzerinde yeni bir TextViewHolder sınıfı oluşturun. Bu sınıf, textview.xml düzenini genişletir ve bir TextViewHolder örneği döndürür. Bunu daha önce yaptığınız için kodu burada bulabilirsiniz. View ve R öğelerini 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

Ardından, SleepNightAdapter beyanını güncellemeniz gerekir. Yalnızca bir ViewHolder türünü desteklemek yerine, herhangi bir görünüm tutucu türünü kullanabilmelidir.

Öğe türlerini tanımlama

  1. SleepNightAdapter.kt içinde, en üst düzeyde, import ifadelerinin altında ve SleepNightAdapter ifadesinin üstünde, görünüm türleri için iki sabit tanımlayın.

    RecyclerView, her öğenin görünüm türünü ayırt etmelidir. Böylece, öğeye doğru bir görünüm tutucu atayabilir.
    private val ITEM_VIEW_TYPE_HEADER = 0
    private val ITEM_VIEW_TYPE_ITEM = 1
  1. SleepNightAdapter içinde, mevcut öğenin türüne bağlı olarak doğru başlığı veya öğe sabitini döndürmek için getItemViewType() değerini 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üncelleme

  1. SleepNightAdapter tanımında, ListAdapter için ilk bağımsız değişkeni SleepNight değerinden DataItem değerine güncelleyin.
  2. SleepNightAdapter 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üncellemelerle ilgili bazı hatalar görürsünüz ve sınıf başlığınız aşağıda gösterildiği gibi görünmelidir.
class SleepNightAdapter(val clickListener: SleepNightListener):
       ListAdapter<DataItem, RecyclerView.ViewHolder>(SleepNightDiffCallback()) {

onCreateViewHolder() işlevini güncelleme

  1. onCreateViewHolder() işlevinin imzasını, RecyclerView.ViewHolder döndürecek şekilde değiştirin.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder
  1. Her öğe türü için uygun görünüm tutucuyu test etmek ve döndürmek üzere onCreateViewHolder() yönteminin uygulanması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}")
        }
    }

onBindViewHolder() işlevini güncelleme

  1. onBindViewHolder() parametresinin türünü ViewHolder'dan RecyclerView.ViewHolder'ye değiştirin.
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
  1. Verilerin yalnızca ViewHolder ise görünüm sahibine atanması için bir koşul ekleyin.
        when (holder) {
            is ViewHolder -> {...}
  1. getItem() tarafından döndürülen nesne türünü DataItem.SleepNightItem olarak yayınlayın. Tamamlanmış onBindViewHolder() işleviniz aşağıdaki gibi görünmelidir.
  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 içindeki yöntemleri, SleepNight yerine yeni DataItem sınıfınızı kullanacak şekilde değiştirin. Aşağıdaki kodda gösterildiği gibi lint uyarısını bastırın.
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
    }
}

Başlığı ekleyip gönderin.

  1. SleepNightAdapter içinde, onCreateViewHolder()'un 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 submitList() yerine bu işlevi kullanarak bir başlık ekleyip listeyi göndereceksiniz.ListAdapter
fun addHeaderAndSubmitList(list: List<SleepNight>?) {}
  1. addHeaderAndSubmitList() içinde, iletilen liste null ise yalnızca bir başlık döndürün. Aksi takdirde, başlığı listenin başına ekleyin ve 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österildiğini gözlemleyin.

Bu uygulamada düzeltilmesi gereken iki sorun var. Biri görünür, diğeri görünür değil.

  • Başlık, sol üst köşede gösterilir ve kolayca ayırt edilemez.
  • Tek başlıklı kısa bir listede bu durum çok önemli olmasa da kullanıcı arayüzü iş parçacığında addHeaderAndSubmitList() ile liste manipülasyonu yapmamalısınız. Yüzlerce öğe, birden fazla başlık ve öğelerin nereye eklenmesi gerektiğine karar verecek mantık içeren bir liste düşünün. Bu işlem bir eş yordama ait olmalıdır.

addHeaderAndSubmitList() işlevini eşzamanlı yordamları kullanacak şekilde değiştirin:

  1. SleepNightAdapter sınıfının en üst düzeyinde, Dispatchers.Default ile bir CoroutineScope tanımlayın.
private val adapterScope = CoroutineScope(Dispatchers.Default)
  1. addHeaderAndSubmitList() içinde, listeyi değiştirmek için adapterScope içinde bir eşzamanlı rutin 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şturulup çalıştırılmalıdır ve herhangi bir fark görmezsiniz.

Şu anda başlık, ızgaradaki diğer öğelerle aynı genişlikte olup yatay ve dikey olarak bir aralık kaplamaktadır. Izgaranın tamamı, yatay olarak tek bir genişlikte üç öğeye sığdığı için başlık yatay olarak üç genişlik kullanmalıdır.

Başlık genişliğini düzeltmek için GridLayoutManager'ya verilerin tüm sütunlara ne zaman yayılacağını söylemeniz gerekir. Bunu, SpanSizeLookup öğesini GridLayoutManager üzerinde yapılandırarak yapabilirsiniz. Bu, GridLayoutManager öğesinin listedeki her öğe için kaç sütun kullanılacağını belirlemek üzere kullandığı bir yapılandırma nesnesidir.

  1. SleepTrackerFragment.kt dosyasını açın.
  2. manager değerini tanımladığınız kodu onCreateView() dosyasının sonuna doğru bulun.
val manager = GridLayoutManager(activity, 3)
  1. manager bölümünün altında, manager.spanSizeLookup değerini gösterildiği gibi tanımlayın. setSpanSizeLookup bir lambda almadığı için object oluşturmanız gerekir. Kotlin'de object oluşturmak için object : classname yazın. Bu örnekte GridLayoutManager.SpanSizeLookup yazın.
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
}
  1. Oluşturucuyu çağırmak için derleyici hatası alabilirsiniz. Bu durumda, oluşturucu çağrısını uygulamak için Option+Enter (Mac) veya Alt+Enter (Windows) ile amaç menüsünü açın.
  1. Ardından, object üzerinde yöntemleri geçersiz kılmanız gerektiğini belirten bir hata mesajı alırsınız. İmleci object üzerine getirin, niyetler 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 yay boyutunu döndürün. 0 konumunun yayılma boyutu 3, diğer konumların yayılma boyutu ise 1'dir. Tamamlanmış kodunuz aşağıdaki gibi görünmelidir:
    manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
            override fun getSpanSize(position: Int) =  when (position) {
                0 -> 3
                else -> 1
            }
        }
  1. Üstbilginizin 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. Uygulamanız aşağıdaki ekran görüntüsüne benzemelidir.

Tebrikler! Tamamladınız.

Android Studio projesi: RecyclerViewHeaders

  • Başlık, genellikle bir listenin genişliğini kaplayan ve başlık veya ayırıcı olarak kullanılan bir öğedir. Bir listede, öğe içeriğini açıklayan tek bir başlık veya öğeleri gruplandırıp birbirinden ayıran birden fazla başlık olabilir.
  • Bir RecyclerView, heterojen bir öğe grubunu (ör. başlıklar ve liste öğeleri) barındırmak için birden fazla görünüm tutucu kullanabilir.
  • Üstbilgi eklemenin bir yolu, üstbilginizin gösterilmesi gereken dizinleri kontrol ederek bağdaştırıcınızı farklı bir ViewHolder kullanacak şekilde değiştirmektir. Üstbilginin takip edilmesinden Adapter sorumludur.
  • Başlık eklemenin bir diğer yolu da veri ızgaranızın temel alınan veri kümesini (listeyi) değiştirmektir. Bu codelab'de yaptığınız işlem de budur.

Başlık eklemenin başlıca adımları şunlardır:

  • Başlık veya veri içerebilen bir DataItem oluşturarak listenizdeki verileri soyutlayın.
  • Adaptörde üstbilgi için bir düzene sahip bir görünüm tutucu oluşturun.
  • Herhangi bir RecyclerView.ViewHolder türünü kullanmak için bağdaştırıcıyı ve yöntemlerini güncelleyin.
  • onCreateViewHolder() içinde, veri öğesi için doğru türde görünüm tutucuyu döndürün.
  • DataItem sınıfıyla çalışmak için SleepNightDiffCallback uygulamasını güncelleyin.
  • Veri kümesine başlık eklemek için eş yordamları kullanan ve ardından submitList() işlevini çağıran bir addHeaderAndSubmitList() işlevi oluşturun.
  • Yalnızca başlığın üç sütun genişliğinde olması için GridLayoutManager.SpanSizeLookup() öğesini uygulayın.

Udacity kursu:

Android geliştirici belgeleri:

Bu bölümde, bir eğitmenin yönettiği kurs kapsamında bu codelab'i tamamlayan öğrenciler için olası ödevler listelenmektedir. Eğitmen, aşağıdakileri yapmalıdır:

  • Gerekirse ödev atayın.
  • Öğrencilere ev ödevi ödevlerini nasıl göndereceklerini bildirin.
  • Ödevlere not verin.

Eğitmenler bu önerileri istedikleri kadar kullanabilir ve uygun olduğunu düşündükleri diğer ödevleri verebilirler.

Bu codelab'i kendi başınıza tamamlıyorsanız bilginizi test etmek için bu ödevleri kullanabilirsiniz.

Bu soruları yanıtlayın

1. Soru

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

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

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

▢ Bir RecyclerView birden fazla başlık türünü destekler ancak verilerin tek tip olması gerekir.

▢ Üstbilgi eklerken, üstbilgiyi doğru konuma yerleştirmek için RecyclerView alt sınıfını oluşturursunuz.

2. Soru

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

▢ Hiçbir zaman. RecyclerView, bir kullanıcı arayüzü öğesidir ve eş yordamlar kullanmamalıdır.

▢ Kullanıcı arayüzünü yavaşlatabilecek uzun süren görevler için eş yordamları kullanın.

▢ Liste manipülasyonları uzun sürebilir ve her zaman eş yordamlar kullanılarak yapılmalıdır.

▢ Ana iş parçacığının engellenmesini önlemek için askıya alma işlevleriyle birlikte eş yordamlar kullanın.

3. Soru

Birden fazla ViewHolder kullanırken aşağıdakilerden hangisini YAPMANIZA gerek YOKTUR?

ViewHolder içinde, gerektiğinde genişletilecek birden fazla düzen dosyası sağlayın.

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

onBindViewHolder() içinde, yalnızca görünüm tutucu veri öğesi için doğru türde bir görünüm tutucuysa verileri bağlayın.

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

Sonraki derse başlayın: 8.1 İnternetten veri alma

Bu kurstaki diğer codelab'lerin bağlantılarını Android Kotlin Hakkında Temel Bilgiler codelab'leri açılış sayfasında bulabilirsiniz.