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 birRecyclerView
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 fazlaViewHolder
kullanma. Özellikle,RecyclerView
içinde gösterilen öğelerin üst kısmına ikinci birViewHolder
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.
- 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.
- SleepNightAdapter.kt'yi açın.
SleepNightListener
sınıfının altında, en üst düzeyde, bir veri öğesini temsil edenDataItem
adlısealed
sınıfı tanımlayın.sealed
sınıfı kapalı bir türü tanımlıyor. Yani bu dosyada tümDataItem
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 birDataItem
türü tanımlamak mümkün değildir.
sealed class DataItem {
}
DataItem
sınıfının gövdesinde, farklı veri öğesi türlerini temsil eden iki sınıf tanımlayın. BirincisiSleepNightItem
, yaniSleepNight
adlı sarmalayıcıdır vesleepNight
olarak adlandırılan tek bir değer alır. Mühürlü sınıfın bir parçası yapmak içinDataItem
süresini uzatın.
data class SleepNightItem(val sleepNight: SleepNight): DataItem()
- İkinci sınıf, başlığı temsil eden
Header
'dir. Bir üstbilginin gerçek verileri olmadığından, bunuobject
olarak bildirebilirsiniz. Yani, yalnızcaHeader
tek bir örnek olacaktır. Yine,DataItem
uzatalım.
object Header: DataItem()
DataItem
içinde, sınıf düzeyindeid
adlı birabstract
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çinDiffUtil
kullandığındaDiffItemCallback
her bir öğenin kimliğini bilmesi gerekir.SleepNightItem
veHeader
soyut mülkü (id
) geçersiz kılması gerektiğinden bir hata göreceksiniz.
abstract val id: Long
SleepNightItem
içinde,nightId
döndürmek içinid
değerini geçersiz kılın.
override val id = sleepNight.nightId
Header
içinde, çok az sayıda (yani -2'nin 63'lük kuvveti)Long.MIN_VALUE
değerini döndürmek içinid
değerini geçersiz kılın. Yani bu durum, mevcut herhangi birnightId
ile çelişmez.
override val id = Long.MIN_VALUE
- 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
- 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" />
"Sleep Results"
öğesini bir dize kaynağına çıkarıpheader_text
olarak adlandırın.
<string name="header_text">Sleep Results</string>
- SleepNightAdapter.kt bölümünde,
SleepNightAdapter
sınıfında,ViewHolder
sınıfının üzerinde yeni birTextViewHolder
sınıfı oluşturun. Bu sınıf, textview.xml düzenini şişirir ve birTextViewHolder
örneği döndürür. Bunu daha önce yaptığınız için kodu burada bulabilirsiniz.View
veR
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
SleepNightAdapter.kt
ürününde en üst düzeyde,import
ifadelerinin altında veSleepNightAdapter
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
SleepNightAdapter
içinde, geçerli öğenin türüne bağlı olarak doğru üst bilgiyi veya öğe sabitini döndürmek içingetItemViewType()
öğ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
SleepNightAdapter
öğesinin tanımında,ListAdapter
için ilk bağımsız değişkeniSleepNight
yerineDataItem
olarak güncelleyin.SleepNightAdapter
öğesinin tanımında,ListAdapter
için ikinci genel bağımsız değişkeniSleepNightAdapter.ViewHolder
yerineRecyclerView.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
RecyclerView.ViewHolder
özelliğini döndürmek içinonCreateViewHolder()
imzasını değiştirin.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder
- 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
ViewHolder
olanonBindViewHolder()
parametre türünüRecyclerView.ViewHolder
olarak değiştirin.
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
- Verileri yalnızca sahip
ViewHolder
ise görünüm sahibine atamak için koşul ekleyin.
when (holder) {
is ViewHolder -> {...}
getItem()
tarafından döndürülen nesne türünüDataItem.SleepNightItem
hedefine yayınlayın. TamamladığınızonBindViewHolder()
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
SleepNightDiffCallback
alanındaki yöntemleri,SleepNight
yerine yeniDataItem
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
SleepNightAdapter
içinde,onCreateViewHolder()
altında aşağıda gösterildiği gibi biraddHeaderAndSubmitList()
işlevi tanımlayın. Bu işlev,SleepNight
listesini alır. Listenizi göndermek içinListAdapter
tarafından sağlanansubmitList()
yerine bu işlevi bir başlık ekleyip listeyi göndermek için kullanırsınız.
fun addHeaderAndSubmitList(list: List<SleepNight>?) {}
addHeaderAndSubmitList()
bölümünde, iletilen listenull
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)
- SleepTrackerFragment.kt dosyasını açın ve
submitList()
çağrısınıaddHeaderAndSubmitList()
olarak değiştirin.
- 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:
SleepNightAdapter
sınıfının en üst düzeyindeDispatchers.Default
içeren birCoroutineScope
tanımlayın.
private val adapterScope = CoroutineScope(Dispatchers.Default)
addHeaderAndSubmitList()
bölgesinde, listeyi değiştirmek içinadapterScope
içinde bir eş yordam başlatın. Ardından, aşağıdaki kodda gösterildiği gibi listeyi göndermek içinDispatchers.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)
}
}
}
- 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.
- SleepTrackerFragment.kt dosyasını açın.
onCreateView()
değerinin sonuna doğrumanager
kodunu tanımladığınız kodu bulun.
val manager = GridLayoutManager(activity, 3)
manager
altındamanager.spanSizeLookup
gösterildiği gibi tanımlayın.setSpanSizeLookup
bir lambda almadığı içinobject
yapmanız gerekiyor. Kotlin'deobject
yapmak içinobject : classname
yazın. Bu örnekteGridLayoutManager.SpanSizeLookup
olacaktır.
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
}
- Oluşturucuyu çağırmak için derleyici hatası alabilirsiniz. Bunu yaparsanız oluşturucu çağrısını uygulamak için
Option+Enter
(Mac) veyaAlt+Enter
(Windows) ile intent menüsünü açın.
- Daha sonra,
object
üzerinde yöntemleri geçersiz kılmanız gerektiğini belirten bir hata alırsınız. İmleciobject
üzerine getirin, niyet menüsünü açmak içinOption+Enter
(Mac) veyaAlt+Enter
(Windows) tuşuna basın, ardındangetSpanSize()
yöntemini geçersiz kılın.
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
}
}
- 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"
- 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çinSleepNightDiffCallback
uygulamasını güncelleyin.- Üstbilgiyi veri kümesine eklemek ve ardından
submitList()
çağrısı yapmak için eş yordam kullanan biraddHeaderAndSubmitList()
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:
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.