RecyclerView बड़े डेटा सेटों को सूचियों और ग्रिड के रूप में कुशलतापूर्वक प्रदर्शित करने के लिए Android Jetpack का एक घटक है। ListView के विपरीत, RecyclerView ViewHolders का पुनः उपयोग करता है और LayoutManager के माध्यम से लेआउट प्रबंधित करता है। Google के अनुसार (Android Developers, 2026), RecyclerView ViewHolder पूलिंग और DiffUtil डिफ़ एल्गोरिदम की बदौलत 1000+ आइटम वाली सूची को स्क्रॉल करते समय 60 फ्रेम प्रति सेकंड तक प्रोसेस करता है। Android ऐप आर्किटेक्चर के बारे में अधिक जानकारी के लिए ListView पर हमारा लेख पढ़ें।
मुख्य बिंदु
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 इसके लिए सर्वोत्तम है: अज्ञात संख्या में आइटम वाली सूचियाँ (फ़ीड, चैट, लॉग), 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 तीन स्वतंत्र परतों में विभाजित है: Adapter डेटा और ViewHolders का प्रबंधन करता है, LayoutManager आइटम स्थिति निर्धारण संभालता है, और ItemAnimator एनिमेशन को नियंत्रित करता है। यह आर्किटेक्चर बाकी को संशोधित किए बिना किसी भी परत को बदलने की अनुमति देता है — उदाहरण के लिए, Adapter कोड बदले बिना LinearLayoutManager से GridLayoutManager पर स्विच करना।
| घटक | ज़िम्मेदारियाँ | कार्यान्वयन |
|---|---|---|
| Adapter | ViewHolders बनाना, डेटा को View से बाइंड करना, परिवर्तनों की सूचना देना | RecyclerView.Adapter<VH> |
| ViewHolder | View संदर्भों को कैश करना, 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 बनाने के बजाय, मौजूदा का पुनः उपयोग किया जाता है — यह मुख्य प्रदर्शन तंत्र है।
ViewHolder एक वर्ग है जो सूची आइटम के अंदर Views (TextView, ImageView, आदि) के संदर्भ संग्रहीत करता है। ViewHolder के बिना, प्रत्येक स्क्रॉल findViewById() को ट्रिगर करेगा — जो Android UI के सबसे महंगे ऑपरेशनों में से एक है। ViewHolder प्रारंभिक बाइंडिंग के बाद संदर्भों को कैश करके इस कॉल को समाप्त करता है।
// डेटा मॉडल
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 परिभाषित करता है कि आइटम RecyclerView के अंदर कैसे स्थित होते हैं। Android तीन डिफ़ॉल्ट कार्यान्वयन प्रदान करता है: LinearLayoutManager, GridLayoutManager, और StaggeredGridLayoutManager। LayoutManager का चुनाव डेटा धारणा और स्क्रॉलिंग प्रदर्शन को प्रभावित करता है।
| LayoutManager | व्यवस्था | कब उपयोग करें | सेटअप विधि |
|---|---|---|---|
| LinearLayoutManager | सूची (लंबवत या क्षैतिज) | फ़ीड, चैट, सूचनाएं, उत्पाद सूचियाँ | LinearLayoutManager(context) |
| GridLayoutManager | N कॉलम वाला ग्रिड | गैलरी, कैटलॉग, आइकन, इमेज ग्रिड | GridLayoutManager(context, spanCount) |
| StaggeredGridLayoutManager | स्टैगर्ड ग्रिड (अलग-अलग आइटम ऊंचाई) | Pinterest बोर्ड, नोट्स, मेसनरी गैलरी | StaggeredGridLayoutManager(spanCount, orientation) |
// 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 RecyclerView में GoF Adapter पैटर्न को लागू करता है: यह डेटा (List<T>) को स्क्रीन पर प्रदर्शित ViewHolders में बदलता है। जब डेटा बदलता है, तो Adapter notifyDataSetChanged(), notifyItemInserted() और समान विधियों के माध्यम से RecyclerView को सूचित कर सकता है। समस्या यह है कि notifyDataSetChanged() सभी दृश्यमान आइटमों को पुनः चित्रित करता है, जिससे जर्क (jank) होता है।
// कुशल अपडेट के लिए 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 का उपयोग करें — वे बैकग्राउंड थ्रेड पर गणना करते हैं।
ListView RecyclerView का पूर्ववर्ती है, जिसे Android 1.0 (API 1) में पेश किया गया था। यह भी सूचियाँ प्रदर्शित करता है लेकिन ViewHolder को अनिवार्य नहीं करता, LayoutManager का समर्थन नहीं करता, और परिवर्तनों को एनिमेट नहीं कर सकता। RecyclerView को सख्त आर्किटेक्चर और बेहतर प्रदर्शन के साथ ListView के प्रतिस्थापन के रूप में डिज़ाइन किया गया था।
| मापदंड | RecyclerView | ListView |
|---|---|---|
| ViewHolder | अनिवार्य (आर्किटेक्चर) | अनुशंसित लेकिन आवश्यक नहीं |
| LayoutManager | पृथक्करण: सूची, ग्रिड, स्टैगर्ड | केवल लंबवत सूची |
| परिवर्तन एनिमेशन | DefaultItemAnimator अंतर्निहित | कोई अंतर्निहित समर्थन नहीं |
| परिवर्तन सूचना | दानेदार: notifyItemInserted/Removed | पूरी सूची के लिए केवल notifyDataSetChanged() |
| DiffUtil | DiffUtil.Callback के माध्यम से समर्थन | कोई समकक्ष नहीं |
| विभाजक | ItemDecoration (कस्टम) | android:divider (अंतर्निहित) |
| न्यूनतम संस्करण | AndroidX के माध्यम से API 14 (Android 4.0) | API 1 (सभी संस्करण) |
Google अनुशंसा (Android Developers, 2026): सभी नए प्रोजेक्ट्स के लिए RecyclerView का उपयोग करें। ListView को लीगेसी कोडबेस में छोड़ा जा सकता है जहां माइग्रेशन लागत को उचित नहीं ठहराता। RecyclerView 100+ आइटम पर बेहतर प्रदर्शन प्रदान करता है, बिना अतिरिक्त समाधानों के क्षैतिज स्क्रॉलिंग और ग्रिड का समर्थन करता है। Android 15 में, ListView को आधिकारिक तौर पर आंशिक रूप से पदावनत चिह्नित किया गया है।
अक्सर पूछे जाने वाले प्रश्न
तीन शर्तों की जाँच करें: (1) Adapter recyclerView.adapter = adapter के माध्यम से सेट है, (2) LayoutManager recyclerView.layoutManager = LinearLayoutManager(context) के माध्यम से सेट है, (3) डेटा सूची खाली नहीं है और adapter को सूचित किया गया है (notifyDataSetChanged())। एक सामान्य गलती notifyDataSetChanged() को कॉल करने के बाद डेटा सेट करना है। डेटा सूचना से पहले असाइन किया जाना चाहिए। सूची का आकार जाँचें: adapter.itemCount 0 से अधिक होना चाहिए।
स्क्रॉल करते समय धीमापन (jank) तब होता है जब onBindViewHolder() भारी संचालन करता है: बिना कैशिंग के छवियाँ लोड करना, bind के अंदर findViewById(), जटिल गणनाएँ। समाधान: (1) एसिंक्रोनस छवि लोडिंग के लिए Glide या Coil का उपयोग करें, (2) सभी findViewById() कॉल को ViewHolder कंस्ट्रक्टर में ले जाएँ, (3) डिफ़ गणना के लिए AsyncListDiffer का उपयोग करें। धीमे फ्रेम खोजने के लिए Android Studio में GPU प्रोफाइलिंग (Profile GPU Rendering) सक्षम करें।
LayoutManager को ओरिएंटेशन पास करें: LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)। दूसरा पैरामीटर reverseLayout है (false = बाएँ से दाएँ)। क्षैतिज ग्रिड के लिए, क्षैतिज ओरिएंटेशन के साथ GridLayoutManager या पेज्ड स्क्रॉलिंग के लिए कस्टम LinearSnapHelper का उपयोग करें। क्षैतिज सूचियाँ उत्पादों, छवियों, श्रेणियों के कैरोसेल के लिए अच्छी तरह से काम करती हैं।
RecyclerView में अंतर्निहित onClickListener नहीं है (ListView के onItemClickListener के विपरीत)। इसे ViewHolder में लागू करें: कंस्ट्रक्टर में लैम्ब्डा पास करें और itemView.setOnClickListener सेट करें। उदाहरण: class ArticleViewHolder(itemView: View, val onItemClick: (Article) -> Unit) : RecyclerView.ViewHolder(itemView)। bind() के अंदर onItemClick(article) कॉल करें। विकल्प जेस्चर हैंडलिंग के लिए RecyclerView.addOnItemTouchListener() का उपयोग करना है।
RecycledViewPool ViewHolders का एक आंतरिक पूल है जो स्क्रॉल करने पर अदृश्य हो गए हैं। नष्ट होने के बजाय, वे पूल में रखे जाते हैं और पुनः उपयोग किए जाते हैं। डिफ़ॉल्ट रूप से, पूल प्रत्येक प्रकार के 5 ViewHolders संग्रहीत करता है। जटिल लेआउट के लिए आकार बढ़ाएँ: recyclerView.getRecycledViewPool().setMaxRecycledViews(VIEW_TYPE_NORMAL, maxCount)। यदि RecyclerView में कई View प्रकार (viewType) हैं, तो पूल प्रत्येक के लिए अलग-अलग स्टैक रखता है। विभिन्न RecyclerViews के बीच RecycledViewPool साझा करने से नेस्टेड सूचियों वाली स्क्रीन पर मेमोरी बचती है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें