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 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 öğelerde tıklamaları yakalama ve işleme
Neler öğreneceksiniz?
- Farklı düzene sahip öğeler eklemek için
RecyclerView
ile birden fazlaViewHolder
öğesini kullanma Özellikle,ViewHolder
öğesini kullanarakRecyclerView
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.
- 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.
- SleepNightAdapter.kt dosyasını açın.
SleepNightListener
sınıfının altında, en üst düzeydeDataItem
adlı birsealed
sınıfı tanımlayın. Bu sınıf, bir veri öğesini temsil eder.
Birsealed
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 birDataItem
türü tanımlaması mümkün değildir.
sealed class DataItem {
}
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 vesleepNight
adlı tek bir değer alır. Sınıfın bir parçası olması içinDataItem
ile genişletin.
data class SleepNightItem(val sleepNight: SleepNight): DataItem()
- İkinci sınıf, başlığı temsil eden
Header
'dır. Başlıkta gerçek veri olmadığından bunuobject
olarak bildirebilirsiniz. YaniHeader
öğesinin yalnızca bir örneği olacaktır. Tekrar uzatmasını isteyinDataItem
.
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 öğenin kimliğini bilmelidir.SleepNightItem
veHeader
,id
soyut özelliğini geçersiz kılması gerektiğinden hata görürsünüz.
abstract val id: Long
SleepNightItem
içindenightId
değerini döndürmek içinid
değerini geçersiz kılın.
override val id = sleepNight.nightId
Header
içinde,id
değerini geçersiz kılarakLong.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 mevcutnightId
ile çakışmaz.
override val id = Long.MIN_VALUE
- 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
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" />
"Sleep Results"
öğesini bir dize kaynağına ayıklayın veheader_text
olarak adlandırın.
<string name="header_text">Sleep Results</string>
- SleepNightAdapter.kt dosyasında,
SleepNightAdapter
içinde,ViewHolder
sınıfının üzerinde yeni birTextViewHolder
sınıfı oluşturun. Bu sınıf, textview.xml düzenini genişletir ve birTextViewHolder
örneği döndürür. Bunu daha önce yaptığınız için kodu burada bulabilirsiniz.View
veR
öğ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
SleepNightAdapter.kt
içinde, en üst düzeyde,import
ifadelerinin altında veSleepNightAdapter
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
SleepNightAdapter
içinde, mevcut öğenin türüne bağlı olarak doğru başlığı veya öğe sabitini döndürmek içingetItemViewType()
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
SleepNightAdapter
tanımında,ListAdapter
için ilk bağımsız değişkeniSleepNight
değerindenDataItem
değerine güncelleyin.SleepNightAdapter
tanımında,ListAdapter
için ikinci genel bağımsız değişkeniSleepNightAdapter.ViewHolder
yerineRecyclerView.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
onCreateViewHolder()
işlevinin imzasını,RecyclerView.ViewHolder
döndürecek şekilde değiştirin.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder
- 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
onBindViewHolder()
parametresinin türünüViewHolder
'danRecyclerView.ViewHolder
'ye değiştirin.
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
- Verilerin yalnızca
ViewHolder
ise görünüm sahibine atanması için bir koşul ekleyin.
when (holder) {
is ViewHolder -> {...}
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
SleepNightDiffCallback
içindeki yöntemleri,SleepNight
yerine yeniDataItem
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.
SleepNightAdapter
içinde,onCreateViewHolder()
'un 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çinsubmitList()
yerine bu işlevi kullanarak bir başlık ekleyip listeyi göndereceksiniz.ListAdapter
fun addHeaderAndSubmitList(list: List<SleepNight>?) {}
addHeaderAndSubmitList()
içinde, iletilen listenull
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)
- 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ö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:
SleepNightAdapter
sınıfının en üst düzeyinde,Dispatchers.Default
ile birCoroutineScope
tanımlayın.
private val adapterScope = CoroutineScope(Dispatchers.Default)
addHeaderAndSubmitList()
içinde, listeyi değiştirmek içinadapterScope
içinde bir eşzamanlı rutin 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ş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.
- SleepTrackerFragment.kt dosyasını açın.
manager
değerini tanımladığınız koduonCreateView()
dosyasının sonuna doğru bulun.
val manager = GridLayoutManager(activity, 3)
manager
bölümünün altında,manager.spanSizeLookup
değerini gösterildiği gibi tanımlayın.setSpanSizeLookup
bir lambda almadığı içinobject
oluşturmanız gerekir. Kotlin'deobject
oluşturmak içinobject : classname
yazın. Bu örnekteGridLayoutManager.SpanSizeLookup
yazın.
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
}
- Oluşturucuyu çağırmak için derleyici hatası alabilirsiniz. Bu durumda, oluşturucu çağrısını uygulamak için
Option+Enter
(Mac) veyaAlt+Enter
(Windows) ile amaç menüsünü açın.
- Ardından,
object
üzerinde yöntemleri geçersiz kılmanız gerektiğini belirten bir hata mesajı alırsınız. İmleciobject
üzerine getirin, niyetler 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 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
}
}
- Ü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"
- 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 edilmesindenAdapter
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çinSleepNightDiffCallback
uygulamasını güncelleyin.- Veri kümesine başlık eklemek için eş yordamları kullanan ve ardından
submitList()
işlevini çağıran biraddHeaderAndSubmitList()
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:
Bu kurstaki diğer codelab'lerin bağlantılarını Android Kotlin Hakkında Temel Bilgiler codelab'leri açılış sayfasında bulabilirsiniz.