LazyRow — Jetpack Compose میں عناصر کی سست لوڈنگ کے ساتھ افقی فہرستیں بنانے کے لیے ایک کمپوزیبل فنکشن ہے۔ Row کے برعکس، LazyRow صرف نظر آنے والے عناصر بناتا ہے اور افقی اسکرولنگ کے دوران انہیں دوبارہ استعمال کرتا ہے۔ Google Android Documentation, 2025 کے مطابق، LazyRow LazyColumn کا افقی ہم منصب ہے اور موبائل ایپلیکیشنز میں کیروسلز، گیلریوں اور افقی مینوز کے لیے موثر ہے۔
اہم نکات
LazyRow — ایک کمپوزیبل فنکشن ہے جو عناصر کی سست لوڈنگ کے ساتھ ایک افقی اسکرول ایبل فہرست کو نافذ کرتا ہے۔ Row کے برعکس، جو ایک ساتھ تمام ذیلی عناصر کو رینڈر کرتا ہے، LazyRow صرف دیکھنے کے علاقے میں نظر آنے والے عناصر بناتا ہے۔
LazyRow LazyColumn جیسے ہی اصول پر کام کرتا ہے، لیکن عناصر کو افقی طور پر ترتیب دیتا ہے۔ بائیں یا دائیں اسکرول کرنے پر، دیکھنے کے علاقے سے باہر نکلنے والے عناصر نئے عناصر کو دکھانے کے لیے دوبارہ استعمال ہوتے ہیں۔ یہ بہت ساری تصاویر والی گیلریوں یا طویل زمرہ جات کی فہرستوں کے لیے انتہائی اہم ہے۔
Android Developers Blog, 2024 کے مطابق، LazyRow LazyColumn جیسی LazyList آرکیٹیکچر استعمال کرتا ہے، جس میں LazyListState، Pool کے ذریعے دوبارہ استعمال کا طریقہ کار اور مختلف عناصر کی اقسام کے لیے سپورٹ شامل ہے۔ زیادہ سے زیادہ کارکردگی عناصر کی مقررہ اونچائی کے ساتھ حاصل کی جاتی ہے۔
LazyRow پیرامیٹرز modifier، state، contentPadding، reverseLayout، horizontalArrangement اور verticalAlignment قبول کرتا ہے۔ مواد LazyColumn کی طرح DSL فنکشنز items اور item کے ذریعے بیان کیا جاتا ہے۔
@Composable
fun SimpleLazyRow() {
val items = (1..50).toList()
LazyRow(
modifier = Modifier.fillMaxWidth().height(100.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(start = 16.dp, end = 16.dp)
) {
items(items) { item ->
Box(
modifier = Modifier.size(80.dp).background(Color.Gray)
) {
Text(text = "$item", modifier = Modifier.align(Alignment.Center))
}
}
}
}
horizontalArrangement LazyRow کے اندر افقی محور کے ساتھ عناصر کی تقسیم کو منظم کرتا ہے۔ Row کی طرح Arrangement کی وہی قدریں دستیاب ہیں: Start، Center، End، SpaceBetween، SpaceEvenly، SpaceAround اور حسب ضرورت فاصلے کے ساتھ spacedBy۔
contentPadding LazyRow کنٹینر کے کناروں پر پیڈنگ شامل کرتا ہے۔ Modifier.padding کے برعکس، contentPadding کو اسکرولنگ کے دوران مدنظر رکھا جاتا ہے: پہلے عنصر میں بائیں کنارے سے پیڈنگ ہوگی، آخری میں دائیں کنارے سے۔ Material Design Guidelines, 2025 کے مطابق، کیروسلز اور گیلریوں کے لیے contentPadding لازمی ہے تاکہ پہلا اور آخری عنصر اسکرین کے کنارے سے چپک نہ جائیں۔
verticalAlignment LazyRow کے اندر عناصر کو عمودی طور پر سیدھ میں لاتا ہے۔ ڈیفالٹ طور پر Alignment.Top استعمال ہوتا ہے۔ مختلف اونچائیوں کے عناصر کو مرکز میں رکھنے کے لیے Alignment.CenterVertically استعمال کریں، جو مختلف تناسب کی تصاویر والے کیروسلز کے لیے مفید ہے۔
| پیرامیٹر | تفصیل | ڈیفالٹ ویلیو |
|---|---|---|
| horizontalArrangement | عناصر کی افقی تقسیم | Arrangement.Start |
| contentPadding | کنٹینر کے کناروں پر پیڈنگ | PaddingValues(0.dp) |
| verticalAlignment | عمودی سیدھ | Alignment.Top |
| reverseLayout | عناصر کی الٹی ترتیب | false |
| userScrollEnabled | صارف اسکرولنگ فعال کریں | true |
LazyListState LazyRow کے لیے LazyColumn کی طرح کام کرتا ہے: یہ پہلے نظر آنے والے عنصر، آفسیٹ اور مجموعی اسکرول پوزیشن کو ٹریک کرتا ہے۔ حالت rememberLazyListState() کے ذریعے بنائی جاتی ہے اور state پیرامیٹر میں منتقل کی جاتی ہے۔
LazyRow کا پروگراماتی اسکرول کنٹرول اسی طریقوں سے کیا جاتا ہے: ہموار اینیمیشن کے لیے animateScrollToItem اور فوری اسکرولنگ کے لیے scrollToItem۔ دونوں کو کوروٹین کے اندر بلایا جاتا ہے۔ یہ آگے/پیچھے بٹن والے کیروسلز یا خودکار اسکرولنگ کے لیے مفید ہے۔
Android Developers, 2024 کے مطابق، LazyRow SnapFlingBehavior کو بھی سپورٹ کرتا ہے — تیز اسکرولنگ کے لیے رویہ جو عناصر کے درمیان نہیں بلکہ قریب ترین عنصر پر رکتا ہے۔ یہ کیروسلز اور گیلریوں کے لیے ایک اسنیپ اثر پیدا کرتا ہے۔
@Composable
fun CarouselWithSnap() {
val listState = rememberLazyListState()
val scope = rememberCoroutineScope()
val items = listOf("A", "B", "C", "D", "E")
Column {
LazyRow(
state = listState,
flingBehavior = SnapFlingBehavior(listState),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
items(items) { item ->
Card(modifier = Modifier.width(150.dp)) {
Text(text = item, modifier = Modifier.padding(16.dp))
}
}
}
Row(modifier = Modifier.fillMaxWidth()) {
Button(onClick = {
scope.launch {
listState.animateScrollToItem(0)
}
}) { Text("شروع کرنے کے لیے") }
}
}
}
پہلی مثال — پیش نظارہ کے ساتھ تصویری گیلری کے لیے LazyRow۔ ہر عنصر ایک Box ہے جس میں ایک تصویر اور کیپشن ہے۔ LazyRow درجنوں اور سینکڑوں تصاویر کو موثر طریقے سے ہینڈل کرتا ہے، صرف نظر آنے والی تصاویر لوڈ کرتا ہے۔
@Composable
fun ImageGallery(images: List<String>) {
LazyRow(
contentPadding = PaddingValues(start = 16.dp, end = 16.dp),
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
items(images, key = { it }) { url ->
AsyncImage(
model = url,
contentDescription = "Image",
modifier = Modifier.size(120.dp)
)
}
}
}
دوسری مثال — آئیکنز کے ساتھ زمرہ جات کی فہرست کے لیے LazyRow۔ زمرہ جات چپس کے طور پر ظاہر ہوتے ہیں اور صارف انہیں افقی طور پر اسکرول کر سکتا ہے۔ spacedBy اور contentPadding کے ساتھ LazyRow زمرہ جات کے درمیان اور کناروں پر فاصلہ بناتا ہے۔
@Composable
fun CategoryChips(categories: List<String>) {
LazyRow(
contentPadding = PaddingValues(horizontal = 16.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
items(categories, key = { it }) { category ->
AssistChip(
onClick = {},
label = { Text(category) }
)
}
}
}
LazyRow اور Row کے درمیان انتخاب عناصر کی تعداد پر منحصر ہے۔ Row 5–10 عناصر کے لیے موزوں ہے جو ہمیشہ اسکرین پر نظر آتے ہیں۔ LazyRow اس وقت ضروری ہے جب بہت سے عناصر ہوں یا ان کی تعداد متغیر ہو۔
Row ایک ساتھ تمام عناصر کو رینڈر کرتا ہے، جس سے بڑی تعداد میں عناصر کے ساتھ تاخیر ہوتی ہے۔ LazyRow صرف نظر آنے والے عناصر کو رینڈر کرتا ہے، جو اسے اسکرول ایبل فہرستوں کے لیے ترجیحی بناتا ہے۔ Android Developers Blog, 2024 کے مطابق، حد تقریباً 10 عناصر ہے: اگر زیادہ عناصر ہوں تو LazyRow استعمال کریں۔
LazyRow اینیمیشن، SnapFlingBehavior اور جداکاروں کے ذریعے گروپنگ کو بھی سپورٹ کرتا ہے، جو اسے پیچیدہ انٹرفیس کے لیے زیادہ لچکدار بناتا ہے۔ Row آسان ہے اور LazyListState کی ضرورت نہیں ہے، لیکن لمبی فہرستوں کے لیے بہتر نہیں ہے۔
اکثر پوچھے گئے سوالات
LazyRow افقی طور پر اسکرول ہوتا ہے اور عناصر کو بائیں سے دائیں ترتیب دیتا ہے، جبکہ LazyColumn عمودی طور پر اوپر سے نیچے اسکرول ہوتا ہے۔ دونوں سست لوڈنگ کے ایک ہی اصول، LazyListState اور DSL items فنکشنز استعمال کرتے ہیں۔
SnapFlingBehavior(listState) کو LazyRow کے flingBehavior پیرامیٹر میں پاس کریں۔ SnapFlingBehavior LazyRow کو عناصر کے درمیان نہیں بلکہ قریب ترین عنصر پر رکنے پر مجبور کرتا ہے، جو کیروسلز کے لیے اسنیپ اثر پیدا کرتا ہے۔
LazyListState.layoutInfo کے ذریعے آخری نظر آنے والے عنصر کو ٹریک کریں اور جب آخری عنصر فہرست کے آخر کے قریب پہنچے تو نیا ڈیٹا لوڈ کریں۔ چکر دار اسکرولنگ کے لیے عناصر کی نقل کے ساتھ حسب ضرورت نفاذ استعمال کریں۔
جی ہاں، LazyRow کو LazyColumn کے اندر نیسٹ کیا جا سکتا ہے۔ یہ عمودی فہرست کے اندر افقی کیروسلز کے ساتھ پیچیدہ صفحات بنانے کا ایک معیاری نمونہ ہے۔ صحیح کام کرنے کے لیے ہر LazyRow کی ایک مقررہ اونچائی ہونی چاہیے۔
LazyListState.layoutInfo.visibleItemsInfo استعمال کریں اور آخری نظر آنے والے عنصر کے انڈیکس کا کل تعداد سے ایک کم کر کے موازنہ کریں۔ جب یہ قدریں مماثل ہوں، LazyRow فہرست کے آخر میں ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں