LazyColumn Jetpack Compose में एक composable फ़ंक्शन है जो तत्वों की लेज़ी लोडिंग के साथ वर्टिकल सूचियाँ बनाने के लिए है। Column के विपरीत, LazyColumn केवल स्क्रीन पर दिखाई देने वाले तत्वों को बनाता और कंपोज़ करता है, स्क्रॉल करने पर उन्हें पुनः उपयोग करता है। Google Android Documentation, 2025 के अनुसार, कुशल मेमोरी प्रबंधन के कारण LazyColumn मोबाइल एप्लिकेशन में बड़े डेटा सेट प्रदर्शित करने का प्राथमिक उपकरण है।
मुख्य बातें
LazyColumn एक composable फ़ंक्शन है जो लेज़ी लोडिंग के साथ एक वर्टिकल स्क्रॉल करने योग्य सूची लागू करता है। Column के विपरीत जो सभी चाइल्ड तत्वों को एक साथ रेंडर करता है, LazyColumn केवल उन तत्वों को बनाता है जो व्यूपोर्ट में आते हैं।
LazyColumn में लेज़ी लोडिंग तंत्र तत्व पुनः उपयोग पर आधारित है: जब कोई तत्व स्क्रॉल करने पर छिप जाता है, तो उसकी composition और layout को एक नए प्रदर्शित तत्व के लिए पुनः उपयोग किया जा सकता है। यह मेमोरी और CPU समय बचाता है, विशेष रूप से लंबी सूचियों पर।
Android Developers Blog, 2024 के अनुसार, LazyColumn महत्वपूर्ण प्रदर्शन गिरावट के बिना दसियों हज़ार तत्वों की सूचियों को कुशलतापूर्वक संभाल सकता है। LazyColumn में प्रत्येक तत्व के पास एक कुंजी (key) होती है जो Compose को सूची बदलने पर तत्व की स्थिति की पहचान करने और संरक्षित करने में मदद करती है।
LazyColumn पैरामीटर modifier, state, contentPadding, reverseLayout, verticalArrangement और horizontalAlignment स्वीकार करता है। सामग्री DSL फ़ंक्शन items और item के माध्यम से लैम्ब्डा ब्लॉक में परिभाषित की जाती है।
@Composable
fun SimpleLazyColumn() {
val itemsList = (1..100).toList()
LazyColumn(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(16.dp)
) {
items(itemsList) { item ->
Text(text = "आइटम $item")
}
}
}
LazyColumn का DSL ब्लॉक सामग्री जोड़ने के लिए items और item फ़ंक्शन प्रदान करता है। items तत्व बनाने के लिए डेटा संग्रह, एक कुंजी और फ़ैक्टरी फ़ंक्शन स्वीकार करता है। item सूची में एकल स्थिर तत्व जोड़ता है।
itemsIndexed items का एक प्रकार है जो डेटा के अतिरिक्त तत्व इंडेक्स भी पास करता है। यह तब उपयोगी होता है जब आपको अलग गणना के बिना तत्व की स्थिति जानने की आवश्यकता हो। items(size) केवल तत्वों की संख्या और फ़ैक्टरी स्वीकार करता है बिना किसी संग्रह से बंधे।
items में key पैरामीटर प्रत्येक तत्व की विशिष्ट पहचान करता है। Material Design Guidelines, 2025 के अनुसार, कुंजियाँ तत्वों को अपडेट और एनिमेट करते समय प्रदर्शन में सुधार करती हैं, क्योंकि Compose कुंजी द्वारा किसी विशिष्ट तत्व की गति या परिवर्तन को ट्रैक कर सकता है।
contentType के साथ items फ़ंक्शन LazyColumn को विभिन्न प्रकार के तत्वों के पुनः उपयोग को अनुकूलित करने की अनुमति देता है। नीचे दिए गए उदाहरण में एक सूची में सेक्शन हेडर और सामान्य पंक्तियों का उपयोग किया गया है।
@Composable
fun MixedItemsList() {
LazyColumn {
item {
Text(
text = "शीर्षक",
style = MaterialTheme.typography.headlineMedium
)
}
items(
items = (1..20).toList(),
key = { it },
contentType = { "item" }
) { item ->
Text(text = "पंक्ति $item")
}
}
}
LazyListState LazyColumn की एक स्थिति ऑब्जेक्ट है जो वर्तमान स्क्रॉल स्थिति, पहले दृश्य तत्व और ऑफ़सेट को ट्रैक करता है। इसे rememberLazyListState() के माध्यम से बनाया जा सकता है और LazyColumn के state पैरामीटर में पास किया जा सकता है।
LazyListState किसी विशिष्ट तत्व पर प्रोग्रामेटिक स्क्रॉलिंग के लिए animateScrollToItem और scrollToItem विधियाँ प्रदान करता है। animateScrollToItem एक स्मूथ स्क्रॉल एनिमेशन बनाता है, जबकि scrollToItem तुरंत स्क्रॉल करता है। दोनों विधियों को CompositionContext में coroutine के अंदर कॉल करने की आवश्यकता होती है।
Android Developers, 2024 के अनुसार, LazyListState में layoutInfo भी होता है जो दृश्य तत्वों के बारे में जानकारी प्रदान करता है — उनके इंडेक्स, ऑफ़सेट और आकार। यह एनालिटिक्स, व्यू ट्रैकिंग या अनंत स्क्रॉलिंग लागू करने के लिए उपयोगी है।
इस उदाहरण में, LazyColumn को LazyListState के माध्यम से नियंत्रित किया जाता है। एक बटन सूची को इंडेक्स 50 वाले तत्व तक स्मूथ एनिमेशन के साथ स्क्रॉल करता है।
@Composable
fun ScrollableList() {
val listState = rememberLazyListState()
val scope = rememberCoroutineScope()
Column {
Button(
onClick = {
scope.launch {
listState.animateScrollToItem(50)
}
}
) {
Text("50 पर स्क्रॉल करें")
}
LazyColumn(state = listState) {
items((1..100).toList()) { item ->
Text(
text = "आइटम $item",
modifier = Modifier.padding(8.dp)
)
}
}
}
}
LazyColumn का प्रमुख प्रदर्शन कारक कुंजियों का सही उपयोग है। प्रत्येक तत्व में key पैरामीटर के माध्यम से एक अद्वितीय स्थिर कुंजी होनी चाहिए। कुंजियों के बिना, Compose डेटा बदलने पर तत्वों को सही ढंग से पुनः उपयोग नहीं कर सकता, जिससे पुनर्संरचना होती है।
contentType LazyColumn को बताता है कि किन तत्वों का layout प्रकार समान है। जब समान contentType वाले दो तत्व रीसाइक्लिंग पूल में प्रवेश करते हैं, तो LazyColumn बिना पुनर्संरचना के उनके layout का पुनः उपयोग कर सकता है। Android Developers Blog, 2024 के अनुसार, contentType विभिन्न तत्व प्रकारों वाली सूचियों में प्रदर्शन में 30–50% सुधार करता है।
LazyColumn के लिए फ़ैक्टरी फ़ंक्शन में अस्थिर पैरामीटर से बचना भी महत्वपूर्ण है। हर बार जब कोई तत्व पैरामीटर बदलता है, Compose उस तत्व को पुनर्संरचित करता है। स्थिर मानों के लिए remember और derivedStateOf का उपयोग पुनर्संरचना की संख्या को कम करता है।
| कारक | प्रभाव | अनुशंसा |
|---|---|---|
| कुंजियाँ (key) | महत्वपूर्ण | items के लिए हमेशा अद्वितीय स्थिर key सेट करें |
| contentType | महत्वपूर्ण | पुनः उपयोग को अनुकूलित करने के लिए तत्व प्रकार निर्दिष्ट करें |
| तत्व का आकार | मध्यम | जहाँ संभव हो निश्चित आकार का उपयोग करें |
| नेस्टेड सूचियाँ | महत्वपूर्ण | LazyColumn के अंदर LazyColumn से बचें — LazyVerticalGrid का उपयोग करें |
stickyHeader LazyColumn का एक DSL फ़ंक्शन है जो स्क्रॉल करने पर सेक्शन हेडर को सूची के शीर्ष पर पिन करता है। जब अगला सेक्शन शीर्ष पर पहुँचता है, तो उसका हेडर वर्तमान हेडर को बदल देता है। यह व्यवहार उपयोगकर्ताओं के लिए संपर्क सूचियों और कैलेंडर से परिचित है।
stickyHeader item के समान एक कुंजी और फ़ैक्टरी फ़ंक्शन स्वीकार करता है। सामान्य item के विपरीत, stickyHeader अपने सेक्शन की सामग्री के माध्यम से स्क्रॉल करते समय दृश्य रहता है। जब कोई सेक्शन पूरी तरह से स्क्रॉल हो जाता है, तो अगले सेक्शन का हेडर पिछले हेडर को बाहर धकेल देता है।
Material Design Guidelines, 2025 के अनुसार, sticky headers लंबी सूचियों में नेविगेशन में सुधार करते हैं और उपयोगकर्ता पर संज्ञानात्मक भार कम करते हैं। sticky header लागू करने के लिए, बस items तत्वों के सापेक्ष सही स्थिति में सेक्शन हेडर को stickyHeader में लपेटें।
@Composable
fun SectionedList(sections: Map<String, List<String>>) {
LazyColumn {
sections.forEach { (header, items) ->
stickyHeader {
Text(
text = header,
modifier = Modifier.background(Color.White)
.padding(16.dp)
)
}
items(items) { item ->
Text(text = item, modifier = Modifier.padding(8.dp))
}
}
}
}
अक्सर पूछे जाने वाले प्रश्न
Column सभी तत्वों को एक साथ रेंडर करता है और 20–30 तत्वों तक की सूचियों के लिए उपयुक्त है। LazyColumn केवल दृश्य तत्व बनाती है और स्क्रॉल करने पर उन्हें पुनः उपयोग करती है, जिससे आप प्रदर्शन हानि के बिना हजारों तत्वों के साथ काम कर सकते हैं।
verticalArrangement पैरामीटर में Arrangement.spacedBy का उपयोग करें या इंडेक्स के माध्यम से विभाजक के साथ items फ़ंक्शन का उपयोग करें। जटिल विभाजकों के लिए, सूची तत्वों के बीच Divider() के साथ एक अलग item जोड़ें।
LazyColumn स्वचालित रूप से पुनर्संरचित होता है जब डेटा संग्रह बदलता है, यदि स्थिर कुंजियों का उपयोग किया जाता है। mutableStateListOf या StateFlow के माध्यम से पता लगाए गए डेटा परिवर्तन केवल बदले हुए तत्वों को फिर से खींचते हैं।
LazyColumn के अंदर LazyColumn का सीधा नेस्टिंग अनुशंसित नहीं है — दोनों में स्वतंत्र स्क्रॉलिंग है, जो जेस्चर संघर्ष बनाता है। इसके बजाय, स्क्रॉल करने योग्य Section के अंदर LazyColumn के साथ एक सामान्य Column या ग्रिड के लिए LazyVerticalGrid का उपयोग करें।
LazyListState.layoutInfo.visibleItemsInfo का उपयोग करें और अंतिम दृश्य तत्व के इंडेक्स की तुलना कुल तत्वों की संख्या से करें। अनंत स्क्रॉलिंग के लिए, ट्रैक करें कि अंतिम दृश्य तत्व सूची के अंत के कितना करीब है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें