LazyRow — یک تابع composable در Jetpack Compose برای ایجاد لیستهای افقی با بارگذاری تنبل عناصر است. برخلاف Row، LazyRow فقط عناصر قابل مشاهده را ایجاد میکند و هنگام پیمایش افقی از آنها مجدداً استفاده میکند. به گفته Google Android Documentation, 2025، LazyRow معادل افقی LazyColumn است و برای چرخ فلکها، گالریها و منوهای افقی در برنامههای موبایل مؤثر است.
نکات مهم
LazyRow — یک تابع composable است که یک لیست افقی قابل پیمایش با بارگذاری تنبل عناصر را پیادهسازی میکند. برخلاف Row که همه عناصر فرزند را همزمان رندر میکند، LazyRow فقط عناصر قابل مشاهده در ناحیه نمایش را ایجاد میکند.
LazyRow مانند LazyColumn کار میکند، اما عناصر را به صورت افقی قرار میدهد. هنگام پیمایش به چپ یا راست، عناصری که از ناحیه دید خارج شدهاند برای نمایش عناصر جدید مجدداً استفاده میشوند. این برای گالریهایی با تعداد زیادی تصویر یا لیستهای طولانی دستهبندی بسیار مهم است.
به گفته Android Developers Blog, 2024، LazyRow از همان معماری LazyList مانند LazyColumn استفاده میکند، از جمله LazyListState، مکانیسم استفاده مجدد از طریق Pool و پشتیبانی از انواع مختلف عناصر. حداکثر کارایی با استفاده از ارتفاع ثابت عناصر به دست میآید.
LazyRow پارامترهای modifier، state، contentPadding، reverseLayout، horizontalArrangement و verticalAlignment را میپذیرد. محتوا از طریق توابع DSL items و item، مشابه LazyColumn تعریف میشود.
@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 کنترل میکند. همان مقادیر Arrangement که در Row وجود دارد در دسترس است: 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 برای لیست دستهبندیها با آیکونها. دستهبندیها به صورت چیپ نمایش داده میشوند و کاربر میتواند آنها را به صورت افقی پیمایش کند. LazyRow با spacedBy و contentPadding فاصله بین دستهبندیها و لبهها را ایجاد میکند.
@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) را در پارامتر flingBehavior LazyRow قرار دهید. SnapFlingBehaviour باعث میشود LazyRow روی نزدیکترین عنصر متوقف شود نه بین عناصر، که یک اثر چسبندگی برای چرخ فلکها ایجاد میکند.
آخرین عنصر قابل مشاهده را از طریق LazyListState.layoutInfo ردیابی کنید و زمانی که آخرین عنصر به انتهای لیست نزدیک میشود دادههای جدید بارگذاری کنید. برای پیمایش چرخهای از پیادهسازی سفارشی با تکرار عناصر استفاده کنید.
بله، LazyRow را میتوان در LazyColumn قرار داد. این یک الگوی استاندارد برای ایجاد صفحات پیچیده با چرخ فلکهای افقی در داخل یک لیست عمودی است. هر LazyRow باید برای عملکرد صحیح ارتفاع ثابتی داشته باشد.
از LazyListState.layoutInfo.visibleItemsInfo استفاده کنید و ایندکس آخرین عنصر قابل مشاهده را با تعداد کل منهای یک مقایسه کنید. وقتی این مقادیر مطابقت دارند، LazyRow در انتهای لیست قرار دارد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید