RecyclerView’a Giriş
Herkese merhabalar 👋. Kotlin ile Android uygulamaları geliştirmeyi öğrenirken hem öğrendiklerimi pekiştirmek hem topluluğa bir şeyler katabilmek adına ufak çaplı yazılar yazmaya karar verdim. İlk yazımda Android dünyasının olmazsa olmazı RecyclerView’ı ele almak istedim. Tek bir yazıda RecyclerView hakkında bütün bildiklerimi yazmaktansa bir seri haline getirmenin daha iyi olacağı görüşündeyim.
Serinin ilk yazısında RecyclerView’ın ne olduğunu, ne işine yaradığını ve ufak bir demo ile nasıl koda aktardığımızı göstermek istiyorum. Hazırsanız RecyclerView’ı tanıyarak başlayalım 🚀.
Nedir bu RecyclerView?
RecyclerView basitçe bir veri setinin, verimli bir şekilde ekrana gelmesini sağlayan bir Class. Biz veriyi ve verinin bulunacağı bir layout sağlarız, RecyclerView kütüphanesi ise bu veriyi, vermiş olduğumuz kalıp içinde dinamik bir şekilde oluşturur.
Siz de benim gibi isminin niye RecyclerView olduğunu düşünüyor olabilirsiniz. Bunu şu şekilde açıklayabiliriz; RecyclerView’da scroll yaptığımız zaman ekran dışına çıkan view yok edilmez bunun yerine ekrana yeni gelecek olan verilerimiz için kullanılır.
Örneğin, aşağıdaki görseli ele aldığımız zaman içindeki verisi “1” olan View ekranın üstünden ekranın dışına doğru çıkıyor . RecyclerView bu View’i yok etmek yerine aşağıdan ekrana gelecek olan yeni verimiz, yani “8” için bu View’ı kullanıyor.
RecyclerView’ın View yok etmeyip, tekrar kullanıyor olmasının sağladığı bazı avantajlar şunlardır:
- Ciddi derecede performansı arttırması
- Responsive’liği arttırması
- Güç tüketimini düşürmesi
- Esnekliğe ve özelliştirmeye açık olması
- LayoutManager kullanmasından ötürü dikey ve yatay scroll’u, Staggered List’i ve Grid’i desteklemesi.
Meyveler ile RecyclerView örneği
RecyclerView data ve view ile direkt olarak etkileşime girmez bunun yerine ViewHolder ile ilgilenir. ViewHolder RecyclerView içindeki tek bir view’i temsil eder. Bizim örneğimizde ViewHolder; aşağıda kodunu görebildiğimiz item_fruit view’ini temsil ediyor.
Adapter ise aldığı veriyi RecyclerView’de ekrana getirebilmek için hazırlar.
Veri kaynağını oluşturmak
Bu blog postunda RecyclerView kullanarak farklı meyve isimlerini ve görsellerini ekrana getireceğiz. Kompleks uygulamalarda verileriniz veritabanından veya API’dan gelebilir fakat bu örnekte localde ufak bir veri kaynağı oluşturup onu kullanacağız.
Veri kaynağımızı oluşturarak örneğimize başlayabiliriz. Fruit
adında bir data class
oluşturup constructor'ına birisi String tipinde fruitName
birisi Int tipinde fruitImage
olmak üzere iki parametre tanımlıyorum.
fruitImage
'i Int tipinde tanımlamamın sebebi meyve resimlerini resource olarak almamızdan kaynaklanıyor.
Data class’ını oluşturduktan sonra verilerimi oluşturacağım FruitDatasource sınıfını oluşturuyorum. Burada Fruit tipindeki verileri liste içinde dönen bir fonksiyon tanımlayıp içine Fruit tipinde elemanlar ekliyorum.
Item layout’unu oluşturmak
Öncelikle RecyclerView’ın ekranda göstereceği viewlar için layout oluşturalım.
Verilerimizi tutacak view’ı oluşturduktan sonra activity_main.xmliçinde RecyclerView oluşturuyorum.
İtemleri tek boyutlu listede düzenlemek istediğimden app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager
kullandım. Bunu istersem programmatically olarak MainActivity.kt
içinde de yapabilirdim fakat ben layout dosyası içinde yapmayı tercih ediyorum. Örneğimizde RecyclerView'ı dikey olarak konumlandırıyoruz, yatay olarak konumlandırmış olsaydım android:orientation="horizontal"
bu satırı yazmam yeterli olacaktı.
Eğer tek boyutlu bir liste yerine tek bir satırda birden fazla item bulundurmak isteseydim GridLayoutManager
, itemlerimin boyutlarının birbirinden farklı, düzensiz bir şekilde gözükmesini isteseydim StaggeredGridLayoutManager
kullanmam gerekirdi.
RecyclerView için Fruit Adapter’inin oluşturulması
Yazının başlarında ekranı scroll yaptığımız zaman kaybolan view yerine yenisinin nasıl geldiğine değinmiştik. Oluşturacağımız Adapter; veri setimizdeki Fruit’ları temsil edecek viewları sağlamadan sorumlu RecyclerView.Adapter
'in subclass'ı olmalıdır. Bu sayede Adapter sınıfımıza onCreateViewHolder
, onBindViewHolder
ve getItemCount
metotlarına ulaşabileceğiz.
İlk olarak FruitAdapter
adında bir sınıf oluşturup RecyclerView.Adapter
ile extends ediyoruz.
Sıra ViewHolder
sınıfını oluşturmaya geldi. FruitAdapter
sınıfının içinde FruitViewHolder
adında bir sınıf daha oluşturuyoruz. Bu sınıfı RecyclerView.ViewHolder
ile extends ediyoruz.
Bu adımları tamamladıktan sonra onCreateViewHolder
, onBindViewHolder
ve getItemCount
metotlarını override ediyoruz. CTRL + I kısayolunu kullanarak bu metotları kolayca override edebilirsiniz.
onCreateViewHolder
RecyclerView ne zaman yeni ViewHolder oluşturmaya ihtiyaç duyarsa o zaman onCreateViewHolder
metodunu çağırır. Bu metot ViewHolder'ı oluşturur ve RecyclerView içinde verilerimiz için view'i inflate ve initialize eder.
onBindViewHolder
RecylerView bu metodu data ile ViewHolder’ı birleştirmek için çağırır. Bu metot uygun datayı çekip view holder layoutunu doldurur. Bizim örneğimizde, RecyclerView meyve isimlerini ve meyve fotoğraflarını ekrana getiriyor, bu metot ise veri kaynağından meyve ismini ve meyve fotoğrafını alarak ViewHolder’ın içinde bulunan fruitName
ve fruitImage
kısmını doldurur.
getItemCount
RecyclerView veri kaynağındaki veri sayısını alabilmek için bu metodu çağırır.
MainActivity ile bağlama
Zorlu aşamaları tamamladıktan sonra geriye en kolay kısım yani RecyclerView’ı MainActivity ile bağlamak kaldı. Burada daha önce oluşturduğumuz veri kaynağını(FruitDatasource
) fruitDatasource
adında bir değişkene atıyorum. Daha sonra fruitRecyclerView
adında bir değişken daha tanımlayıp RecyclerView'e eşitliyorum. fruitRecyclerView
'ın adapterini de oluşturmuş olduğumuz FruitAdapter
'e eşitleyerek activity kısmındaki işlerimizi tamamlıyoruz.
Şimdi kodu çalıştırıp nasıl gözüküyor bi’ bakalım
Gördüğünüz üzere kod sıkıntısız bir şekilde çalışıyor 👍.
Bu postta RecyclerView’e basitçe değinmeye çalıştım. Serinin diğer postlarında Grid ve Staggered List kullanma, item decorator, RecyclerView’de onClick işlemleri, item ekleme ve çıkarma, RecyclerView.adapter yerine ListAdapter kullanma, Data binding ve ViewBinding ile RecyclerView gibi konuları ele almaya çalışacağım. Umarım bu postu beğenmişsinizdir, diğer postlarda görüşmek üzere 👋.