RecyclerView Performans Sorunları: Sık Yapılan Hatalar

RecyclerView'de performans sorunu yaşıyorsan, genellikle üç noktada hata yapılıyor: layout inflation, ViewHolder pattern ihlali ve gereksiz binding işlemleri.

En yaygın hatası yapanlar, her satır bağlanırken yeni bir layout inflate ediyor. Bu, liste kaydırıldıkça binlerce kez tekrarlanıyor ve uygulamayı donduruyor.

Yanlış yaklaşım:

1override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
2val view = LayoutInflater.from(context).inflate(R.layout.item_row, null)
3val textView = view.findViewById<TextView>(R.id.text)
4textView.text = items[position]
5}

Bu kodda her bağlama işleminde yeni bir layout dosyası okunuyor. Listeyi kaydırırken CPU'n %80 harcıyor.

Doğru yaklaşım:

1class MyViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
2private val textView: TextView = itemView.findViewById(R.id.text)
3
4fun bind(item: String) {
5textView.text = item
6}
7}
8
9override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
10val view = LayoutInflater.from(parent.context).inflate(R.layout.item_row, parent, false)
11return MyViewHolder(view)
12}
13
14override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
15holder.bind(items[position])
16}

Layout inflate işi `onCreateViewHolder`'a taşındı. Bu metod sadece görüntüye ihtiyaç duyduğunda çağrılıyor; kaydırırken tekrarlanmıyor.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Her binding işleminde ViewHolder içinde `findViewById` çağırmak, ağaç taraması yapar ve performans düşürür.

1override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
2val textView = holder.itemView.findViewById<TextView>(R.id.text) // YANLIŞ
3textView.text = items[position]
4}

Bu her satır için tekrarlanan gereksiz bir işlem. Doğrusu, ViewHolder constructor'ında bir kez referans al:

1class MyViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
2val textView: TextView = itemView.findViewById(R.id.text) // BİR KEZ
3}

Resim yüklemek, API çağrısı yapmak veya veri işlemek binding sırasında yapılırsa, liste kaydırırken donuyor.

1override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
2val image = loadImageFromNetwork(items[position].imageUrl) // YANLIŞ
3holder.imageView.setImageBitmap(image)
4}

Bunu Glide veya Coil gibi kütüphanelerle yap; asenkron yükleme otomatik olur:

1override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
2Glide.with(context).load(items[position].imageUrl).into(holder.imageView)
3}

Glide, resmi arka planda indirir ve cache'ler. Liste kaydırması sorunsuz kalır.

Layout inflate'i `onCreateViewHolder`'a al, ViewHolder'da referans koru, ağır işleri asenkron yap. Bu üç adım RecyclerView'i hızlandırır.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz