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)34fun bind(item: String) {5textView.text = item6}7}89override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {10val view = LayoutInflater.from(parent.context).inflate(R.layout.item_row, parent, false)11return MyViewHolder(view)12}1314override 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.
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 KEZ3}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.
0 yorum