RecyclerView — nedir, Android'de ViewHolder ve Adapter

Yazar: IT Sectr Yayınlanma: 2026-02-23 Okuma süresi: 8 dk

RecyclerView, büyük veri kümelerini listeler ve ızgaralar halinde verimli bir şekilde görüntülemek için bir Android Jetpack bileşenidir. ListView'ın aksine RecyclerView, ViewHolder'ları yeniden kullanır ve düzeni LayoutManager aracılığıyla yönetir. Google'a göre (Android Developers, 2026), RecyclerView, ViewHolder havuzlaması ve DiffUtil fark algoritması sayesinde 1000+ öğeli bir listeyi kaydırırken saniyede 60 kareye kadar işlem yapar. Android uygulama mimarisi hakkında daha fazla bilgi için ListView hakkındaki makalemize göz atın.

Önemli Noktalar

  • RecyclerView, Android'de listeler için modern bir bileşendir ve Android 5.0'da (API 21) ListView'ın yerini almıştır.
  • ViewHolder, View referanslarını önbelleğe alan ve kaydırma sırasında hücre yeniden kullanımını hızlandıran bir desendir.
  • Adapter, verilerle RecyclerView arasındaki köprüdür, ViewHolder'ları oluşturmaktan ve verileri bağlamaktan sorumludur.
  • LayoutManager, öğelerin konumlandırılmasını tanımlar: dikey/yatay liste (LinearLayoutManager), ızgara (GridLayoutManager), kademeli (StaggeredGridLayoutManager).
  • DiffUtil, eski ve yeni listeler arasındaki farkı hesaplamak için bir yardımcı programdır ve öğelerin yeniden çizilmesini en aza indirir.

RecyclerView nedir?

RecyclerView, Google I/O 2014'te Android Support Library v7'nin bir parçası olarak tanıtılan Android Jetpack kütüphanesinin bir bileşenidir. Dinamik listeleri ve ızgaraları yüksek performansla görüntülemek için tasarlanmıştır. RecyclerView, ListView'ın yerine geçecek şekilde ortaya çıkmış ve selefinin temel sorununu — zorunlu ViewHolder yeniden kullanımının olmamasını — çözmüştür.

RecyclerView mimarisi Model-View-Adapter deseni üzerine kurulmuştur: veriler bir modelde (List, LiveData, Flow) saklanır, işleme Adapter tarafından yönetilir ve düzen LayoutManager tarafından kontrol edilir. Her bileşen kendi alanından sorumludur ve bu da sistemi esnek ve genişletilebilir kılar.

Android Developers anketine (2025) göre, Google Play ilk 100'deki Android uygulamalarının %78'inde RecyclerView kullanılmaktadır. 1000+ öğeli bir liste için kaydırma performansı, üç mekanizma sayesinde orta sınıf cihazlarda 60 FPS'de sabit kalır: ViewHolder havuzlama, fark tabanlı güncelleme hesaplaması ve eşzamansız veri yükleme.

RecyclerView ne zaman kullanılır

RecyclerView şunlar için idealdir: bilinmeyen sayıda öğe içeren listeler (feed'ler, sohbetler, günlükler), N sütunlu ızgaralar (galeriler, kataloglar), kademeli düzenler (Pinterest panoları) ve ekleme/kaldırma animasyonları olan listeler. 2–5 öğeli basit ekranlar için LinearLayout veya ScrollView daha basit ve verimlidir — RecyclerView ek yük getirir.

Bağımlılığı ayarlama

RecyclerView'ı kullanmak için build.gradle (app)'e bağımlılığı ekleyin: implementation 'androidx.recyclerview:recyclerview:1.4.0'. Minimum API sürümü 14'tür (Android 4.0). AndroidX RecyclerView 1.3.0'dan itibaren, öğe seçimi için recyclerview-selection ve kaydırma hareketleri için recyclerview-swipe modülleri mevcuttur.

RecyclerView nasıl çalışır: üç temel bileşen

RecyclerView üç bağımsız katmana ayrılmıştır: Adapter verileri ve ViewHolder'ları yönetir, LayoutManager öğelerin konumlandırılmasıyla ilgilenir ve ItemAnimator animasyonları kontrol eder. Bu mimari, diğerlerini değiştirmeden herhangi bir katmanın değiştirilmesine olanak tanır — örneğin, Adapter kodunu değiştirmeden LinearLayoutManager'dan GridLayoutManager'a geçmek.

BileşenSorumluluklarUygulama
AdapterViewHolder oluşturma, verileri View'a bağlama, değişiklikleri bildirmeRecyclerView.Adapter<VH>
ViewHolderView referanslarını önbelleğe alma, findViewById()'den kaçınmaRecyclerView.ViewHolder
LayoutManagerÖğeleri konumlandırma, kaydırma yönünü belirlemeLinearLayoutManager, GridLayoutManager, StaggeredGridLayoutManager
ItemAnimatorÖğe ekleme, kaldırma, taşıma animasyonuDefaultItemAnimator
ItemDecorationÖğeler arasında ayırıcılar, boşluklar, arka planlar çizmeRecyclerView.ItemDecoration

Çalışma döngüsü: (1) Adapter, onCreateViewHolder() aracılığıyla bir ViewHolder oluşturur, (2) LayoutManager, ekranda yeni View'ın konumunu belirler, (3) Adapter, onBindViewHolder() aracılığıyla verileri bağlar, (4) kaydırma sırasında ekrandan çıkan ViewHolder'lar yeniden kullanım için havuza (RecycledViewPool) girer. Yeni View'lar oluşturmak yerine mevcut olanlar yeniden kullanılır — bu temel performans mekanizmasıdır.

RecyclerView'da ViewHolder uygulaması

ViewHolder, bir liste öğesi içindeki View'lara (TextView, ImageView, vb.) referansları saklayan bir sınıftır. ViewHolder olmadan, her kaydırma findViewById()'i tetikler — Android arayüzünün en pahalı işlemlerinden biri. ViewHolder, ilk bağlamadan sonra referansları önbelleğe alarak bu çağrıyı ortadan kaldırır.

kotlin
// Veri modeli
data class Article(
    title: String,
    summary: String,
    author: String,
    imageUrl: String?
)

// ViewHolder — View referanslarını saklar
class ArticleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    private val titleText = itemView.findViewById<TextView>(R.id.tvTitle)
    private val summaryText = itemView.findViewById<TextView>(R.id.tvSummary)
    private val authorText = itemView.findViewById<TextView>(R.id.tvAuthor)

    fun bind(article: Article) {
        titleText.text = article.title
        summaryText.text = article.summary
        authorText.text = article.author
    }
}

Pratik kural: öğe düzenindeki her View, findViewById() ile tam olarak bir kez — kurucuda — ViewHolder özelliği olarak bildirilmelidir. bind() yöntemi findViewById() çağırmaz, yalnızca metin, renkler ve dinleyiciler ayarlar. Bu yaklaşım, Google'a göre (Android Performance Patterns, 2025) liste kaydırmayı %30–50 hızlandırır.

LayoutManager türleri: öğe yerleşimini seçme

LayoutManager, öğelerin RecyclerView içinde nasıl konumlandırılacağını tanımlar. Android üç varsayılan uygulama sağlar: LinearLayoutManager, GridLayoutManager ve StaggeredGridLayoutManager. LayoutManager seçimi, veri algısını ve kaydırma performansını etkiler.

LayoutManagerYerleşimNe zaman kullanılırKurulum yöntemi
LinearLayoutManagerListe (dikey veya yatay)Feed'ler, sohbetler, bildirimler, ürün listeleriLinearLayoutManager(context)
GridLayoutManagerN sütunlu ızgaraGaleriler, kataloglar, simgeler, görüntü ızgaralarıGridLayoutManager(context, spanCount)
StaggeredGridLayoutManagerKademeli ızgara (farklı öğe yükseklikleri)Pinterest panoları, notlar, masonry galerileriStaggeredGridLayoutManager(spanCount, orientation)
kotlin
// Fragment'te LinearLayoutManager ayarlama
class ArticleListFragment : Fragment() {
    private lateinit var binding: FragmentArticleListBinding

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val recyclerView = binding.recyclerView
        recyclerView.layoutManager = LinearLayoutManager(requireContext())
        recyclerView.adapter = ArticleAdapter(articlesList)

        // Optimizasyon: sabit boyut + havuz
        recyclerView.setHasFixedSize(true)
        recyclerView.setItemViewCacheSize(20)

        // Öğeler arasında ayırıcı
        val divider = DividerItemDecoration(requireContext(), LinearLayoutManager.VERTICAL)
        recyclerView.addItemDecoration(divider)
    }
}

Performans: Dikey kaydırmalı LinearLayoutManager en hızlı seçenektir çünkü öğeler sırayla yerleştirilir ve LayoutManager O(1)'de konumları hesaplar. GridLayoutManager, sütun bölme için ek hesaplamalar gerektirir ancak sabit spanCount ile verimli kalır. StaggeredGridLayoutManager üçü arasında en yavaş olanıdır çünkü komşu öğelerin yüksekliklerini dikkate alarak kademede öğe konumlarını hesaplaması gerekir. Yalnızca görsel olarak farklı hücre yükseklikleri gerektiğinde kullanın.

Adapter ve DiffUtil: verimli veri güncelleme

Adapter, RecyclerView'da GoF Adapter desenini uygular: verileri (List<T>) ekranda görüntülenen ViewHolder'lara dönüştürür. Veriler değiştiğinde, Adapter notifyDataSetChanged(), notifyItemInserted() ve benzer yöntemlerle RecyclerView'ı bilgilendirebilir. Sorun, notifyDataSetChanged()'in tüm görünür öğeleri yeniden çizmesi ve takılmalara (jank) neden olmasıdır.

kotlin
// Verimli güncellemeler için DiffUtil ile Adapter
class ArticleAdapter : RecyclerView.Adapter<ArticleViewHolder>() {

    private var articles: List<Article> = emptyList()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ArticleViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_article, parent, false)
        return ArticleViewHolder(view)
    }

    override fun onBindViewHolder(holder: ArticleViewHolder, position: Int) {
        holder.bind(articles[position])
    }

    override fun getItemCount(): Int = articles.size

    // DiffUtil ile listeyi güncelleme
    fun updateArticles(newArticles: List<Article>) {
        val diffCallback = ArticleDiffCallback(articles, newArticles)
        val diffResult = DiffUtil.calculateDiff(diffCallback)
        articles = newArticles
        diffResult.dispatchUpdatesTo(this)
    }
}

// DiffUtil için Callback
class ArticleDiffCallback(
    private val oldList: List<Article>,
    private val newList: List<Article>
) : DiffUtil.Callback() {

    override fun getOldListSize() = oldList.size
    override fun getNewListSize() = newList.size

    override fun areItemsTheSame(oldPos: Int, newPos: Int): Boolean {
        return oldList[oldPos].title == newList[newPos].title
    }

    override fun areContentsTheSame(oldPos: Int, newPos: Int): Boolean {
        return oldList[oldPos] == newList[newPos]
    }
}

DiffUtil, eski listeyi yeni listeye dönüştürmek için minimum işlem sayısını (ekle, kaldır, taşı, değiştir) hesaplayan Eugene W. Myers fark algoritmasını kullanır. 100 öğeli bir liste için DiffUtil 1–5 ms içinde çalışır (Google, 2025). Büyük listeler (10000+) için Paging kütüphanesinden AsyncListDiffer veya PagingDataAdapter kullanın — hesaplamaları arka plan iş parçacığında gerçekleştirirler.

RecyclerView vs ListView: karşılaştırma

ListView, RecyclerView'ın öncülüdür ve Android 1.0'da (API 1) tanıtılmıştır. Ayrıca listeleri görüntüler ancak ViewHolder'ı zorunlu kılmaz, LayoutManager'ı desteklemez ve değişiklikleri canlandıramaz. RecyclerView, daha katı bir mimari ve daha iyi performansla ListView'ın yerini alacak şekilde tasarlanmıştır.

KriterRecyclerViewListView
ViewHolderZorunlu (mimari)Önerilir ancak zorunlu değil
LayoutManagerAyrım: liste, ızgara, kademeliYalnızca dikey liste
Değişiklik animasyonuDefaultItemAnimator yerleşikYerleşik destek yok
Değişiklik bildirimiAyrıntılı: notifyItemInserted/RemovedYalnızca tüm liste için notifyDataSetChanged()
DiffUtilDiffUtil.Callback aracılığıyla destekEşdeğeri yok
AyırıcılarItemDecoration (özel)android:divider (yerleşik)
Minimum sürümAndroidX aracılığıyla API 14 (Android 4.0)API 1 (tüm sürümler)

Google önerisi (Android Developers, 2026): tüm yeni projeler için RecyclerView kullanın. ListView, geçiş maliyetinin haklı olmadığı eski kod tabanlarında kalabilir. RecyclerView, 100+ öğede daha iyi performans sunar, ek geçici çözümler olmadan yatay kaydırmayı ve ızgaraları destekler. Android 15'te ListView resmi olarak kısmen kullanımdan kaldırılmış olarak işaretlenmiştir.

Sıkça Sorulan Sorular

RecyclerView öğeleri görüntülemiyor — ne yapmalı?

Üç koşulu kontrol edin: (1) Adapter recyclerView.adapter = adapter ile ayarlandı mı, (2) LayoutManager recyclerView.layoutManager = LinearLayoutManager(context) ile ayarlandı mı, (3) veri listesi boş değil ve adapter bilgilendirildi mi (notifyDataSetChanged()). Tipik bir hata, notifyDataSetChanged() çağrıldıktan sonra veri ayarlamaktır. Veriler bildirimden önce atanmalıdır. Liste boyutunu kontrol edin: adapter.itemCount 0'dan büyük olmalıdır.

RecyclerView neden yavaş kayıyor?

Kaydırma sırasındaki yavaşlık (jank), onBindViewHolder() ağır işlemler yaptığında oluşur: önbelleksiz resim yükleme, bind içinde findViewById(), karmaşık hesaplamalar. Çözümler: (1) eşzamansız resim yükleme için Glide veya Coil kullanın, (2) tüm findViewById() çağrılarını ViewHolder kurucusuna taşıyın, (3) fark hesaplamaları için AsyncListDiffer kullanın. Yavaş kareleri bulmak için Android Studio'da GPU Profil Oluşturma'yı (Profile GPU Rendering) etkinleştirin.

Yatay RecyclerView nasıl yapılır?

LayoutManager'a yönü iletin: LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false). İkinci parametre reverseLayout'dur (false = soldan sağa). Yatay bir ızgara için yatay yönlendirmeli GridLayoutManager veya sayfalı kaydırma için özel LinearSnapHelper kullanın. Yatay listeler, ürün, resim ve kategori karuselleri için uygundur.

RecyclerView öğesine tıklama dinleyicisi nasıl eklenir?

RecyclerView'ın (onItemClickListener'a sahip ListView'ın aksine) yerleşik bir onClickListener'ı yoktur. Bunu ViewHolder'da uygulayın: kurucuya bir lambda iletin ve itemView.setOnClickListener ayarlayın. Örnek: class ArticleViewHolder(itemView: View, val onItemClick: (Article) -> Unit) : RecyclerView.ViewHolder(itemView). bind() içinde onItemClick(article) çağrısı yapın. Alternatif olarak, jest işleme için RecyclerView.addOnItemTouchListener() kullanın.

RecycledViewPool nedir ve nasıl yapılandırılır?

RecycledViewPool, kaydırma sırasında görünmez hale gelen ViewHolder'ların dahili bir havuzudur. Yok edilmek yerine havuzda tutulur ve yeniden kullanılır. Varsayılan olarak havuz, her türden 5 ViewHolder depolar. Karmaşık düzenler için boyutu artırın: recyclerView.getRecycledViewPool().setMaxRecycledViews(VIEW_TYPE_NORMAL, maxCount). Bir RecyclerView'da birden çok View türü (viewType) varsa, havuz her biri için ayrı yığınlar tutar. Farklı RecyclerView'lar arasında RecycledViewPool paylaşmak, iç içe listeler içeren ekranlarda bellek tasarrufu sağlar.

Özet

  • RecyclerView, 60 FPS'ye kadar performansla listeler ve ızgaralar için modern bir Android Jetpack bileşenidir.
  • ViewHolder, View önbellekleme için zorunlu bir desendir ve her kaydırmada findViewById()'i ortadan kaldırır.
  • Adapter, onCreateViewHolder ve onBindViewHolder aracılığıyla verileri yönetir ve ViewHolder'ları oluşturur.
  • LayoutManager — üç uygulama: LinearLayoutManager (liste), GridLayoutManager (ızgara), StaggeredGridLayoutManager (kademeli).
  • DiffUtil — minimum liste güncellemesi için algoritma: tam yenileme yerine ayrıntılı yeniden çizim.
  • RecyclerView, ilk 100'deki Android uygulamalarının %78'inde kullanılır ve Google tarafından ListView yerine resmi olarak önerilir.
  • RecyclerView performansı, ViewHolder havuzlama, ayrıntılı bildirimler ve eşzamansız fark hesaplaması yoluyla elde edilir.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun