تكرار السؤال: …
الإجابة المختصرة
يعيد تدوير الـ Views التي تخرج عن نطاق الشاشة لعرض عناصر جديدة بدل إنشائها من الصفر، مما يمنع استدعاءات findViewById المتكررة.
الشرح
يحتفظ ViewHolder بمراجع عناصر الواجهة في الذاكرة. عند التمرير، لا يقوم الـ RecyclerView بإنشاء View جديدة، بل يستدعي onCreateViewHolder فقط لعدد كافٍ لملء الشاشة مع هامش بسيط، ثم يعيد استخدام هذه الحاويات عبر onBindViewHolder لتحديث النصوص والصور فقط، مما يوفر سلاسة فائقة بمعدل 60/120 إطار في الثانية.
مثال بالكود
class UserAdapter : RecyclerView.Adapter<UserAdapter.UserViewHolder>() {
class UserViewHolder(val binding: ItemUserBinding) : RecyclerView.ViewHolder(binding.root)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
val binding = ItemUserBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return UserViewHolder(binding)
}
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
holder.binding.nameText.text = items[position].name
}
}أخطاء شائعة
- تنفيذ عمليات معالجة مكلفة أو حسابات معقدة داخل onBindViewHolder مما يسبب تقطيعاً ملحوظاً أثناء التمرير.
- نسيان ضبط setHasFixedSize(true) عندما تكون أبعاد القائمة ثابتة ومستقلة عن محتوياتها.