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 में से 78% Android ऐप्स में RecyclerView का उपयोग किया जाता है। 1000+ आइटम वाली सूची के लिए स्क्रॉलिंग प्रदर्शन तीन तंत्रों की बदौलत मध्य-श्रेणी के उपकरणों पर 60 FPS पर स्थिर रहता है: ViewHolder पूलिंग, डिफ़-आधारित अपडेट गणना, और एसिंक्रोनस डेटा लोडिंग।

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+) के लिए, AsyncListDiffer या Paging लाइब्रेरी से 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 का उपयोग करें। क्षैतिज सूचियाँ उत्पादों, छवियों, श्रेणियों के कैरोसेल के लिए अच्छी तरह से काम करती हैं।

RecyclerView आइटम में क्लिक लिसनर कैसे जोड़ें?

RecyclerView में अंतर्निहित onClickListener नहीं है (ListView के onItemClickListener के विपरीत)। इसे 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें