RecyclerView — یہ کیا ہے، Android میں ViewHolder اور Adapter

مصنف: IT Sectr اشاعت: 2026-02-23 مطالعے کا وقت: 8 منٹ

RecyclerView Android Jetpack کا ایک جزو ہے جو بڑے ڈیٹا سیٹوں کو فہرستوں اور گرڈز کی شکل میں مؤثر طریقے سے ظاہر کرنے کے لیے ہے۔ ListView کے برعکس، RecyclerView ViewHolders کو دوبارہ استعمال کرتا ہے اور LayoutManager کے ذریعے لے آؤٹ کا نظم کرتا ہے۔ Google (Android Developers، 2026) کے مطابق، RecyclerView ViewHolder پولنگ اور DiffUtil فرق الگورتھم کی بدولت 1000+ آئٹمز کی فہرست کو اسکرول کرتے ہوئے 60 فریم فی سیکنڈ تک پروسیس کرتا ہے۔ Android ایپ آرکیٹیکچر کے بارے میں مزید جاننے کے لیے ListView پر ہمارا مضمون پڑھیں۔

اہم نکات

  • RecyclerView Android میں فہرستوں کے لیے ایک جدید جزو ہے، جس نے Android 5.0 (API 21) میں ListView کی جگہ لی۔
  • ViewHolder View حوالہ جات کو کیش کرنے کا ایک نمونہ ہے، جو اسکرولنگ کے دوران سیل کے دوبارہ استعمال کو تیز کرتا ہے۔
  • Adapter ڈیٹا اور RecyclerView کے درمیان ربط ہے، جو ViewHolders بنانے اور ڈیٹا بائنڈ کرنے کا ذمہ دار ہے۔
  • LayoutManager عناصر کی پوزیشننگ کی وضاحت کرتا ہے: عمودی/افقی فہرست (LinearLayoutManager)، گرڈ (GridLayoutManager)، سیڑھی نما (StaggeredGridLayoutManager).
  • DiffUtil پرانی اور نئی فہرستوں کے درمیان فرق کا حساب لگانے کے لیے ایک افادیت ہے، جو عناصر کی دوبارہ ڈرائنگ کو کم سے کم کرتی ہے۔

RecyclerView کیا ہے؟

RecyclerView Android Jetpack لائبریری کا ایک جزو ہے، جو Google I/O 2014 میں Android Support Library v7 کے حصے کے طور پر پیش کیا گیا تھا۔ یہ متحرک فہرستوں اور گرڈز کو اعلیٰ کارکردگی کے ساتھ ظاہر کرنے کے لیے ڈیزائن کیا گیا ہے۔ RecyclerView ListView کے متبادل کے طور پر سامنے آیا اور اپنے پیشرو کے اہم مسئلے — لازمی ViewHolder دوبارہ استعمال کی کمی — کو حل کرتا ہے۔

RecyclerView آرکیٹیکچر Model-View-Adapter پیٹرن پر بنایا گیا ہے: ڈیٹا ایک ماڈل (List، LiveData، Flow) میں محفوظ کیا جاتا ہے، رینڈرنگ Adapter کے ذریعے منظم کی جاتی ہے، اور لے آؤٹ LayoutManager کے ذریعے کنٹرول کیا جاتا ہے۔ ہر جزو اپنے علاقے کا ذمہ دار ہے، جو نظام کو لچکدار اور قابل توسیع بناتا ہے۔

Android Developers سروے (2025) کے مطابق، Google Play ٹاپ 100 میں Android ایپس کے 78% میں RecyclerView استعمال ہوتا ہے۔ 1000+ آئٹمز والی فہرست کے لیے اسکرولنگ کارکردگی تین میکانزم — ViewHolder پولنگ، فرق پر مبنی اپ ڈیٹ کیلکولیشن، اور غیر ہم وقت ساز ڈیٹا لوڈنگ — کی بدولت درمیانے درجے کے آلات پر 60 FPS پر مستحکم رہتی ہے۔

RecyclerView کب استعمال کریں

RecyclerView اس کے لیے بہترین ہے: نامعلوم تعداد میں آئٹمز والی فہرستیں (فیڈز، چیٹس، لاگز)، N کالم والے گرڈز (گیلریاں، کیٹلاگ)، سیڑھی نما لے آؤٹ (Pinterest بورڈز)، اور آئٹم شامل کرنے/ہٹانے کی اینیمیشن والی فہرستیں۔ 2–5 آئٹمز والی سادہ اسکرینوں کے لیے، LinearLayout یا ScrollView آسان اور زیادہ موثر ہیں — RecyclerView اضافی بوجھ ڈالتا ہے۔

انحصار ترتیب دینا

RecyclerView استعمال کرنے کے لیے، build.gradle (app) میں انحصار شامل کریں: implementation 'androidx.recyclerview:recyclerview:1.4.0'۔ کم از کم API ورژن 14 (Android 4.0) ہے۔ AndroidX RecyclerView 1.3.0 سے شروع ہو کر، آئٹم انتخاب کے لیے recyclerview-selection اور سوائپ اشاروں کے لیے recyclerview-swipe ماڈیولز دستیاب ہیں۔

RecyclerView کیسے کام کرتا ہے: تین اہم اجزاء

RecyclerView تین آزاد تہوں میں تقسیم ہے: Adapter ڈیٹا اور ViewHolders کا نظم کرتا ہے، LayoutManager آئٹم پوزیشننگ سنبھالتا ہے، اور ItemAnimator اینیمیشن کو کنٹرول کرتا ہے۔ یہ آرکیٹیکچر دوسری تہوں کو تبدیل کیے بغیر کسی بھی تہ کو تبدیل کرنے کی اجازت دیتا ہے — مثال کے طور پر، Adapter کوڈ کو تبدیل کیے بغیر LinearLayoutManager سے GridLayoutManager پر سوئچ کرنا۔

جزوذمہ داریاںنفاذ
AdapterViewHolders بنانا، ڈیٹا کو View سے بائنڈ کرنا، تبدیلیوں کی اطلاع دیناRecyclerView.Adapter<VH>
ViewHolderView حوالہ جات کو کیش کرنا، findViewById() سے بچناRecyclerView.ViewHolder
LayoutManagerآئٹم پوزیشننگ، اسکرول سمت کا تعینLinearLayoutManager، GridLayoutManager، StaggeredGridLayoutManager
ItemAnimatorآئٹم شامل کرنے، ہٹانے، منتقل کرنے کی اینیمیشنDefaultItemAnimator
ItemDecorationآئٹمز کے درمیان تقسیم کرنے والے، وقفے، پس منظر کھینچناRecyclerView.ItemDecoration

کام کا چکر: (1) Adapter onCreateViewHolder() کے ذریعے ViewHolder بناتا ہے، (2) LayoutManager اسکرین پر نئے View کی پوزیشن کا تعین کرتا ہے، (3) Adapter onBindViewHolder() کے ذریعے ڈیٹا بائنڈ کرتا ہے، (4) اسکرولنگ کے دوران، اسکرین سے باہر جانے والے ViewHolders دوبارہ استعمال کے لیے پول (RecycledViewPool) میں داخل ہوتے ہیں۔ نئے Views بنانے کے بجائے، موجودہ کو دوبارہ استعمال کیا جاتا ہے — یہ اہم کارکردگی کا طریقہ کار ہے۔

RecyclerView میں ViewHolder کا نفاذ

ViewHolder ایک کلاس ہے جو فہرست آئٹم کے اندر Views (TextView، ImageView، وغیرہ) کے حوالہ جات محفوظ کرتی ہے۔ ViewHolder کے بغیر، ہر اسکرول findViewById() کو متحرک کرے گا — Android UI کے سب سے مہنگے آپریشنوں میں سے ایک۔ ViewHolder ابتدائی بائنڈنگ کے بعد حوالہ جات کو کیش کر کے اس کال کو ختم کرتا ہے۔

kotlin
// ڈیٹا ماڈل
data class Article(
    title: String,
    summary: String,
    author: String,
    imageUrl: String?
)

// ViewHolder — View حوالہ جات محفوظ کرتا ہے
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
    }
}

عملی اصول: آئٹم لے آؤٹ میں ہر View کو ViewHolder پراپرٹی کے طور پر findViewById() کے ساتھ صرف ایک بار — کنسٹرکٹر میں — اعلان کیا جانا چاہیے۔ bind() طریقہ findViewById() کو کال نہیں کرتا، یہ صرف متن، رنگ اور سننے والے سیٹ کرتا ہے۔ یہ طریقہ Google (Android Performance Patterns، 2025) کے مطابق فہرست اسکرولنگ کو 30–50% تیز کرتا ہے۔

LayoutManager کی اقسام: عناصر کی ترتیب کا انتخاب

LayoutManager وضاحت کرتا ہے کہ آئٹمز RecyclerView کے اندر کیسے رکھے جاتے ہیں۔ Android تین ڈیفالٹ نفاذ فراہم کرتا ہے: LinearLayoutManager، GridLayoutManager، اور StaggeredGridLayoutManager۔ LayoutManager کا انتخاب ڈیٹا کے ادراک اور اسکرولنگ کارکردگی کو متاثر کرتا ہے۔

LayoutManagerترتیبکب استعمال کریںسیٹ اپ کا طریقہ
LinearLayoutManagerفہرست (عمودی یا افقی)فیڈز، چیٹس، اطلاعات، مصنوعات کی فہرستیںLinearLayoutManager(context)
GridLayoutManagerN کالم والا گرڈگیلریاں، کیٹلاگ، آئیکنز، تصویری گرڈزGridLayoutManager(context, spanCount)
StaggeredGridLayoutManagerسیڑھی نما گرڈ (مختلف آئٹم اونچائیاں)Pinterest بورڈز، نوٹس، میسنری گیلریاںStaggeredGridLayoutManager(spanCount, orientation)
kotlin
// Fragment میں LinearLayoutManager ترتیب دینا
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)

        // بهینه کاری: مقرره سائز + پول
        recyclerView.setHasFixedSize(true)
        recyclerView.setItemViewCacheSize(20)

        // آئٹمز کے درمیان تقسیم کرنے والا
        val divider = DividerItemDecoration(requireContext(), LinearLayoutManager.VERTICAL)
        recyclerView.addItemDecoration(divider)
    }
}

کارکردگی: عمودی اسکرولنگ کے ساتھ LinearLayoutManager سب سے تیز آپشن ہے کیونکہ آئٹمز ترتیب وار رکھے جاتے ہیں اور LayoutManager O(1) میں پوزیشنوں کا حساب لگاتا ہے۔ GridLayoutManager کو کالم کی تقسیم کے لیے اضافی حسابات کی ضرورت ہوتی ہے لیکن یہ مقررہ spanCount کے ساتھ موثر رہتا ہے۔ StaggeredGridLayoutManager تینوں میں سب سے سست ہے کیونکہ اسے پڑوسی آئٹمز کی اونچائیوں کو مدنظر رکھتے ہوئے جھرن میں آئٹم پوزیشنوں کا حساب لگانا ہوتا ہے۔ اسے صرف اس وقت استعمال کریں جب بصری طور پر مختلف سیل اونچائیوں کی ضرورت ہو۔

Adapter اور DiffUtil: موثر ڈیٹا اپ ڈیٹ

Adapter RecyclerView میں GoF Adapter پیٹرن کو نافذ کرتا ہے: یہ ڈیٹا (List<T>) کو اسکرین پر دکھائے جانے والے ViewHolders میں تبدیل کرتا ہے۔ جب ڈیٹا تبدیل ہوتا ہے، تو Adapter notifyDataSetChanged()، notifyItemInserted() اور اسی طرح کے طریقوں کے ذریعے RecyclerView کو مطلع کر سکتا ہے۔ مسئلہ یہ ہے کہ notifyDataSetChanged() تمام دکھائی دینے والے آئٹمز کو دوبارہ کھینچتا ہے، جس سے جھٹکے (jank) پیدا ہوتے ہیں۔

kotlin
// موثر اپ ڈیٹ کے لیے DiffUtil کے ساتھ 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 کے ذریعے فہرست اپ ڈیٹ کرنا
    fun updateArticles(newArticles: List<Article>) {
        val diffCallback = ArticleDiffCallback(articles, newArticles)
        val diffResult = DiffUtil.calculateDiff(diffCallback)
        articles = newArticles
        diffResult.dispatchUpdatesTo(this)
    }
}

// DiffUtil کے لیے 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 Eugene W. Myers کے فرق الگورتھم کا استعمال کرتا ہے، جو پرانی فہرست کو نئی میں تبدیل کرنے کے لیے کم سے کم آپریشنز (داخل کریں، ہٹائیں، منتقل کریں، تبدیل کریں) کا حساب لگاتا ہے۔ 100 آئٹمز کی فہرست کے لیے، DiffUtil 1–5 ms میں کام کرتا ہے (Google، 2025)۔ بڑی فہرستوں (10000+) کے لیے، Paging لائبریری سے AsyncListDiffer یا PagingDataAdapter استعمال کریں — یہ پس منظر کے تھریڈ پر حسابات انجام دیتے ہیں۔

RecyclerView بمقابلہ ListView: موازنہ

ListView RecyclerView کا پیشرو ہے، جو Android 1.0 (API 1) میں متعارف کرایا گیا تھا۔ یہ بھی فہرستیں دکھاتا ہے لیکن ViewHolder کو لازمی نہیں کرتا، LayoutManager کو سپورٹ نہیں کرتا، اور تبدیلیوں کو متحرک نہیں کر سکتا۔ RecyclerView کو سخت آرکیٹیکچر اور بہتر کارکردگی کے ساتھ ListView کے متبادل کے طور پر ڈیزائن کیا گیا تھا۔

معیارRecyclerViewListView
ViewHolderلازمی (آرکیٹیکچر)تجویز کردہ لیکن لازمی نہیں
LayoutManagerعلیحدگی: فہرست، گرڈ، سیڑھی نماصرف عمودی فہرست
تبدیلی اینیمیشنDefaultItemAnimator بلٹ انکوئی بلٹ ان سپورٹ نہیں
تبدیلی کی اطلاعتفصیلی: notifyItemInserted/Removedصرف پوری فہرست کے لیے notifyDataSetChanged()
DiffUtilDiffUtil.Callback کے ذریعے سپورٹکوئی مساوی نہیں
تقسیم کرنے والےItemDecoration (حسب ضرورت)android:divider (بلٹ ان)
کم از کم ورژنAndroidX کے ذریعے API 14 (Android 4.0)API 1 (تمام ورژن)

Google کی سفارش (Android Developers، 2026): تمام نئے پروجیکٹس کے لیے RecyclerView استعمال کریں۔ ListView کو پرانے کوڈ بیسز میں چھوڑا جا سکتا ہے جہاں منتقلی لاگت کا جواز پیش نہیں کرتی۔ RecyclerView 100+ آئٹمز پر بہتر کارکردگی فراہم کرتا ہے، اضافی حل کے بغیر افقی اسکرولنگ اور گرڈز کو سپورٹ کرتا ہے۔ Android 15 میں، ListView کو باضابطہ طور پر جزوی طور پر فرسودہ قرار دیا گیا ہے۔

اکثر پوچھے گئے سوالات

RecyclerView آئٹمز نہیں دکھا رہا — کیا کریں؟

تین شرائط چیک کریں: (1) Adapter recyclerView.adapter = adapter کے ذریعے سیٹ کیا گیا ہے، (2) LayoutManager recyclerView.layoutManager = LinearLayoutManager(context) کے ذریعے سیٹ کیا گیا ہے، (3) ڈیٹا کی فہرست خالی نہیں ہے اور adapter کو مطلع کیا گیا ہے (notifyDataSetChanged())۔ ایک عام غلطی notifyDataSetChanged() کو کال کرنے کے بعد ڈیٹا سیٹ کرنا ہے۔ ڈیٹا اطلاع سے پہلے تفویض کیا جانا چاہیے۔ فہرست کا سائز چیک کریں: adapter.itemCount 0 سے بڑا ہونا چاہیے۔

RecyclerView سست کیوں اسکرول ہوتا ہے؟

اسکرولنگ کے دوران سُستی (jank) اس وقت ہوتی ہے جب onBindViewHolder() بھاری آپریشنز کرتا ہے: بغیر کیش کے تصاویر لوڈ کرنا، bind کے اندر findViewById()، پیچیدہ حسابات۔ حل: (1) غیر ہم وقت ساز تصویر لوڈنگ کے لیے Glide یا Coil استعمال کریں، (2) تمام findViewById() کالز کو ViewHolder کنسٹرکٹر میں منتقل کریں، (3) فرق حسابات کے لیے AsyncListDiffer استعمال کریں۔ سست فریم تلاش کرنے کے لیے Android Studio میں GPU پروفائلنگ (Profile GPU Rendering) فعال کریں۔

افقی RecyclerView کیسے بنائیں؟

LayoutManager کو سمت دیں: LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)۔ دوسرا پیرامیٹر reverseLayout ہے (false = بائیں سے دائیں)۔ افقی گرڈ کے لیے، افقی سمت کے ساتھ GridLayoutManager یا صفحہ وار اسکرولنگ کے لیے حسب ضرورت LinearSnapHelper استعمال کریں۔ افقی فہرستیں مصنوعات، تصاویر، زمروں کے carousels کے لیے موزوں ہیں۔

RecyclerView آئٹم میں کلک سننے والا کیسے شامل کریں؟

RecyclerView میں (onItemClickListener والے ListView کے برعکس) بلٹ ان onClickListener نہیں ہے۔ اسے ViewHolder میں نافذ کریں: کنسٹرکٹر میں ایک لیمبڈا دیں اور itemView.setOnClickListener سیٹ کریں۔ مثال: class ArticleViewHolder(itemView: View, val onItemClick: (Article) -> Unit) : RecyclerView.ViewHolder(itemView)۔ bind() کے اندر onItemClick(article) کال کریں۔ متبادل اشاروں کی پروسیسنگ کے لیے RecyclerView.addOnItemTouchListener() استعمال کرنا ہے۔

RecycledViewPool کیا ہے اور اسے کیسے ترتیب دیں؟

RecycledViewPool ViewHolders کا ایک اندرونی پول ہے جو اسکرولنگ کے دوران غیر مرئی ہو گئے ہیں۔ تباہ ہونے کے بجائے، وہ پول میں رکھے جاتے ہیں اور دوبارہ استعمال کیے جاتے ہیں۔ ڈیفالٹ طور پر، پول ہر قسم کے 5 ViewHolders محفوظ کرتا ہے۔ پیچیدہ لے آؤٹ کے لیے سائز بڑھائیں: recyclerView.getRecycledViewPool().setMaxRecycledViews(VIEW_TYPE_NORMAL, maxCount)۔ اگر RecyclerView میں متعدد View اقسام (viewType) ہیں، تو پول ہر ایک کے لیے علیحدہ اسٹیک رکھتا ہے۔ مختلف RecyclerViews کے درمیان RecycledViewPool کا اشتراک کرنے سے نیسٹڈ فہرستوں والی اسکرینوں پر میموری بچتی ہے۔

خلاصہ

  • RecyclerView 60 FPS تک کارکردگی کے ساتھ فہرستوں اور گرڈز کے لیے ایک جدید Android Jetpack جزو ہے۔
  • ViewHolder View کیشنگ کے لیے ایک لازمی نمونہ ہے، جو ہر اسکرول پر findViewById() کو ختم کرتا ہے۔
  • Adapter onCreateViewHolder اور onBindViewHolder کے ذریعے ڈیٹا کا نظم کرتا ہے اور ViewHolders بناتا ہے۔
  • LayoutManager — تین نفاذ: LinearLayoutManager (فہرست)، GridLayoutManager (گرڈ)، StaggeredGridLayoutManager (سیڑھی نما)۔
  • DiffUtil — کم سے کم فہرست اپ ڈیٹ کے لیے الگورتھم: مکمل ریفریش کے بجائے تفصیلی دوبارہ ڈرائنگ۔
  • RecyclerView ٹاپ 100 میں 78% Android ایپس میں استعمال ہوتا ہے اور Google کی طرف سے ListView کے بجائے باضابطہ طور پر تجویز کردہ ہے۔
  • RecyclerView کی کارکردگی ViewHolder پولنگ، تفصیلی اطلاعات اور غیر ہم وقت ساز فرق حسابات کے ذریعے حاصل کی جاتی ہے۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں