Add items(count: Int) overload for LazyColumn/LazyRow/LazyVerticalGrid
Relnote: "New items(count: Int) factory method for scope of LazyColumn/LazyRow/LazyVerticalGrid.
items(items: List) and itemsIndexed(items: List) are now extension functions so you have to manually import them when used.
New extension overloads for Arrays: items(items: Array) and itemsIndexed(Array)"
Test: new tests for arrays, updates few of existing tests
Fixes: 175562574
Change-Id: I803fc5f25fac55855c710ff5064f11525f7b6010
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimatedVisiblilityLazyColumnDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimatedVisiblilityLazyColumnDemo.kt
index 2d1b4b4..85eda9a 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimatedVisiblilityLazyColumnDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimatedVisiblilityLazyColumnDemo.kt
@@ -28,6 +28,7 @@
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/EnterExitTransitionDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/EnterExitTransitionDemo.kt
index 4e85b17..f04c311 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/EnterExitTransitionDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/EnterExitTransitionDemo.kt
@@ -38,6 +38,7 @@
import androidx.compose.foundation.layout.preferredHeight
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.selection.selectable
import androidx.compose.material.Button
import androidx.compose.material.Checkbox
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.kt
index ffec340..38fe987 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.kt
@@ -41,6 +41,7 @@
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.rememberScrollbarAdapter
import androidx.compose.foundation.shape.CircleShape
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index 6c0c722..862e432 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -329,6 +329,10 @@
public final class LazyDslKt {
method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
method @androidx.compose.runtime.Composable public static void LazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+ method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
}
public final class LazyForKt {
@@ -340,12 +344,15 @@
public final class LazyGridKt {
method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyVerticalGrid(androidx.compose.foundation.lazy.GridCells cells, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyGridScope,kotlin.Unit> content);
+ method public static inline <T> void items(androidx.compose.foundation.lazy.LazyGridScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void items(androidx.compose.foundation.lazy.LazyGridScope, T![] items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyGridScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyGridScope, T![] items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
}
public interface LazyGridScope {
method public void item(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
- method public <T> void items(java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
- method public <T> void itemsIndexed(java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public void items(int count, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
}
@androidx.compose.runtime.Stable public interface LazyItemScope {
@@ -382,8 +389,7 @@
public interface LazyListScope {
method public void item(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
- method public <T> void items(java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
- method public <T> void itemsIndexed(java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public void items(int count, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
method @androidx.compose.foundation.ExperimentalFoundationApi public void stickyHeader(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
}
diff --git a/compose/foundation/foundation/api/public_plus_experimental_current.txt b/compose/foundation/foundation/api/public_plus_experimental_current.txt
index 6c0c722..862e432 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_current.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_current.txt
@@ -329,6 +329,10 @@
public final class LazyDslKt {
method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
method @androidx.compose.runtime.Composable public static void LazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+ method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
}
public final class LazyForKt {
@@ -340,12 +344,15 @@
public final class LazyGridKt {
method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyVerticalGrid(androidx.compose.foundation.lazy.GridCells cells, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyGridScope,kotlin.Unit> content);
+ method public static inline <T> void items(androidx.compose.foundation.lazy.LazyGridScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void items(androidx.compose.foundation.lazy.LazyGridScope, T![] items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyGridScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyGridScope, T![] items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
}
public interface LazyGridScope {
method public void item(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
- method public <T> void items(java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
- method public <T> void itemsIndexed(java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public void items(int count, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
}
@androidx.compose.runtime.Stable public interface LazyItemScope {
@@ -382,8 +389,7 @@
public interface LazyListScope {
method public void item(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
- method public <T> void items(java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
- method public <T> void itemsIndexed(java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public void items(int count, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
method @androidx.compose.foundation.ExperimentalFoundationApi public void stickyHeader(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
}
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 6c0c722..862e432 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -329,6 +329,10 @@
public final class LazyDslKt {
method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
method @androidx.compose.runtime.Composable public static void LazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+ method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
}
public final class LazyForKt {
@@ -340,12 +344,15 @@
public final class LazyGridKt {
method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyVerticalGrid(androidx.compose.foundation.lazy.GridCells cells, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyGridScope,kotlin.Unit> content);
+ method public static inline <T> void items(androidx.compose.foundation.lazy.LazyGridScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void items(androidx.compose.foundation.lazy.LazyGridScope, T![] items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyGridScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyGridScope, T![] items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
}
public interface LazyGridScope {
method public void item(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
- method public <T> void items(java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
- method public <T> void itemsIndexed(java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public void items(int count, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
}
@androidx.compose.runtime.Stable public interface LazyItemScope {
@@ -382,8 +389,7 @@
public interface LazyListScope {
method public void item(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
- method public <T> void items(java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
- method public <T> void itemsIndexed(java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public void items(int count, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
method @androidx.compose.foundation.ExperimentalFoundationApi public void stickyHeader(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
}
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
index d46aa5e..258a646 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
@@ -43,6 +43,8 @@
import androidx.compose.foundation.lazy.GridCells
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.samples.StickyHeaderSample
import androidx.compose.foundation.shape.RoundedCornerShape
@@ -120,7 +122,7 @@
Button(modifier = buttonModifier, onClick = { offset++ }) { Text("Offset") }
}
LazyColumn(Modifier.fillMaxWidth()) {
- items((1..numItems).map { it + offset }.toList()) {
+ items((1..numItems).map { it + offset }) {
Text("$it", style = AmbientTextStyle.current.copy(fontSize = 40.sp))
}
}
@@ -193,7 +195,7 @@
Modifier.fillMaxWidth(),
state = state
) {
- items((0..1000).toList()) {
+ items(1000) {
Text("$it", style = AmbientTextStyle.current.copy(fontSize = 40.sp))
}
}
@@ -215,7 +217,7 @@
@Composable
private fun LazyRowItemsDemo() {
LazyRow {
- items((1..1000).toList()) {
+ items(1000) {
Square(it)
}
}
@@ -253,12 +255,12 @@
private fun RtlListDemo() {
Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
LazyRow(Modifier.fillMaxWidth()) {
- itemsIndexed((0..100).toList()) { index, item ->
+ items(100) {
Text(
- "$item",
+ "$it",
Modifier
.size(100.dp)
- .background(if (index % 2 == 0) Color.LightGray else Color.Transparent)
+ .background(if (it % 2 == 0) Color.LightGray else Color.Transparent)
.padding(16.dp)
)
}
@@ -287,7 +289,7 @@
@Composable
private fun LazyColumnScope() {
LazyColumn {
- items((1..10).toList()) {
+ items(10) {
Text("$it", fontSize = 40.sp)
}
@@ -305,7 +307,7 @@
@Composable
private fun LazyRowScope() {
LazyRow {
- items((1..10).toList()) {
+ items(10) {
Text("$it", fontSize = 40.sp)
}
@@ -363,7 +365,7 @@
verticalArrangement = Arrangements[arrangement],
modifier = Modifier.weight(1f).fillMaxHeight()
) {
- (1..count).forEach {
+ repeat(count) {
item()
}
}
@@ -371,7 +373,7 @@
verticalArrangement = Arrangements[arrangement],
modifier = Modifier.weight(1f).fillMaxHeight()
) {
- items((1..count).toList()) {
+ items(count) {
item()
}
}
@@ -434,12 +436,12 @@
modifier = Modifier.weight(1f).fillMaxHeight()
) {
if (reverse) {
- (count downTo 1).forEach {
+ (count - 1 downTo 0).forEach {
item2(it)
item1(it)
}
} else {
- (1..count).forEach {
+ (0 until count).forEach {
item1(it)
item2(it)
}
@@ -450,7 +452,7 @@
state = lazyState,
modifier = Modifier.weight(1f).fillMaxHeight()
) {
- items((1..count).toList()) {
+ items(count) {
item1(it)
item2(it)
}
@@ -475,12 +477,12 @@
LazyColumn {
item {
LazyRow {
- items(List(100) { it }) {
+ items(100) {
item(it)
}
}
}
- items(List(100) { it }) {
+ items(100) {
item(it)
}
}
@@ -512,9 +514,7 @@
LazyVerticalGrid(
cells = mode
) {
- items(
- items = (1..100).toList()
- ) {
+ items(100) {
Text(
text = "$it",
fontSize = 20.sp,
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt
index 1b71a259..6a442fd 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt
@@ -23,6 +23,8 @@
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyRow
+import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@@ -85,7 +87,7 @@
Modifier.fillMaxWidth().background(Color.LightGray).padding(8.dp)
)
}
- items((0..9).toList()) {
+ items(10) {
Text("Item $it from the section $section")
}
}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyArrangementsTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyArrangementsTest.kt
index e0dc1e2..e08cd60 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyArrangementsTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyArrangementsTest.kt
@@ -62,7 +62,7 @@
LazyColumn(
modifier = Modifier.size(containerSize)
) {
- items((0..1).toList()) {
+ items(2) {
Box(Modifier.size(itemSize).testTag(it.toString()))
}
}
@@ -96,7 +96,7 @@
LazyRow(
modifier = Modifier.size(containerSize)
) {
- items((0..1).toList()) {
+ items(2) {
Box(Modifier.size(itemSize).testTag(it.toString()))
}
}
@@ -152,7 +152,7 @@
verticalArrangement = Arrangement.spacedBy(itemSize),
modifier = Modifier.testTag(ContainerTag)
) {
- items((0..1).toList()) {
+ items(2) {
Box(Modifier.size(itemSize))
}
}
@@ -170,7 +170,7 @@
horizontalArrangement = Arrangement.spacedBy(itemSize),
modifier = Modifier.testTag(ContainerTag)
) {
- items((0..1).toList()) {
+ items(2) {
Box(Modifier.size(itemSize))
}
}
@@ -190,7 +190,7 @@
verticalArrangement = Arrangement.spacedBy(itemSize),
modifier = Modifier.size(itemSize * 3.5f)
) {
- items((0..2).toList()) {
+ items(3) {
Box(Modifier.size(itemSize).testTag(it.toString()))
}
}
@@ -210,7 +210,7 @@
verticalArrangement = Arrangement.spacedBy(itemSize),
modifier = Modifier.size(itemSize * 3.5f).testTag(ContainerTag)
) {
- items((0..2).toList()) {
+ items(3) {
Box(Modifier.size(itemSize).testTag(it.toString()))
}
}
@@ -233,7 +233,7 @@
horizontalArrangement = Arrangement.spacedBy(itemSize),
modifier = Modifier.size(itemSize * 3.5f)
) {
- items((0..2).toList()) {
+ items(3) {
Box(Modifier.size(itemSize).testTag(it.toString()))
}
}
@@ -253,7 +253,7 @@
horizontalArrangement = Arrangement.spacedBy(itemSize),
modifier = Modifier.size(itemSize * 3.5f).testTag(ContainerTag)
) {
- items((0..2).toList()) {
+ items(3) {
Box(Modifier.size(itemSize).testTag(it.toString()))
}
}
@@ -278,7 +278,7 @@
reverseLayout = true,
modifier = Modifier.size(containerSize)
) {
- items((0..1).toList()) {
+ items(2) {
Box(Modifier.size(itemSize).testTag(it.toString()))
}
}
@@ -294,7 +294,7 @@
reverseLayout = true,
modifier = Modifier.size(containerSize)
) {
- items((0..1).toList()) {
+ items(2) {
Box(Modifier.size(itemSize).testTag(it.toString()))
}
}
@@ -311,7 +311,7 @@
verticalArrangement = arrangement,
modifier = Modifier.size(containerSize)
) {
- items((0..1).toList()) {
+ items(2) {
Box(Modifier.size(itemSize).testTag(it.toString()))
}
}
@@ -325,7 +325,7 @@
horizontalArrangement = arrangement,
modifier = Modifier.size(containerSize)
) {
- items((0..1).toList()) {
+ items(2) {
Box(Modifier.size(itemSize).testTag(it.toString()))
}
}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt
index 506aa92..fd5fc25 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt
@@ -184,14 +184,12 @@
var disposed = false
// Ten 31dp spacers in a 300dp list
val latch = CountDownLatch(10)
- // Make it long enough that it's _definitely_ taller than the screen
- val data = (1..50).toList()
rule.setContent {
// Fixed height to eliminate device size as a factor
Box(Modifier.testTag(LazyListTag).preferredHeight(300.dp)) {
LazyColumn(Modifier.fillMaxSize()) {
- items(data) {
+ items(50) {
onCommit {
composed = true
// Signal when everything is done composing
@@ -285,7 +283,7 @@
rule.setContent {
if (emitAdapterList) {
LazyColumn(Modifier.fillMaxSize()) {
- items(listOf(0, 1)) {
+ items(2) {
Box(Modifier.size(100.dp))
onDispose {
if (it == 1) {
@@ -987,7 +985,6 @@
@Test
fun stateIsRestored() {
val restorationTester = StateRestorationTester(rule)
- val items by mutableStateOf((1..20).toList())
var state: LazyListState? = null
restorationTester.setContent {
state = rememberLazyListState()
@@ -995,7 +992,7 @@
Modifier.size(100.dp).testTag(LazyListTag),
state = state!!
) {
- items(items) {
+ items(20) {
Spacer(Modifier.size(20.dp).testTag("$it"))
}
}
@@ -1046,7 +1043,6 @@
@Test
fun snapToItemIndex() {
- val items by mutableStateOf((1..20).toList())
lateinit var state: LazyListState
rule.setContent {
state = rememberLazyListState()
@@ -1054,7 +1050,7 @@
Modifier.size(100.dp).testTag(LazyListTag),
state = state
) {
- items(items) {
+ items(20) {
Spacer(Modifier.size(20.dp).testTag("$it"))
}
}
@@ -1097,12 +1093,11 @@
@Test
fun itemInvalidationIsNotCausingAnotherItemToRedraw() {
- val items = (0..1).toList()
val redrawCount = Array(2) { 0 }
var stateUsedInDrawScope by mutableStateOf(false)
rule.setContent {
LazyColumn(Modifier.size(100.dp).testTag(LazyListTag)) {
- items(items) {
+ items(2) {
Spacer(
Modifier.size(50.dp)
.drawBehind {
@@ -1130,7 +1125,6 @@
@Test
fun notVisibleAnymoreItemNotAffectingCrossAxisSize() {
- val items = (0..1).toList()
val itemSize = with(rule.density) { 30.toDp() }
val itemSizeMinusOne = with(rule.density) { 29.toDp() }
lateinit var state: LazyListState
@@ -1139,7 +1133,7 @@
Modifier.height(itemSizeMinusOne).testTag(LazyListTag),
state = rememberLazyListState().also { state = it }
) {
- items(items) {
+ items(2) {
Spacer(
if (it == 0) {
Modifier.width(30.dp).height(itemSizeMinusOne)
@@ -1187,6 +1181,54 @@
.assertWidthIsEqualTo(30.dp)
}
+ @Test
+ fun usedWithArray() {
+ val items = arrayOf("1", "2", "3")
+
+ val itemSize = with(rule.density) { 15.toDp() }
+
+ rule.setContent {
+ LazyColumn {
+ items(items) {
+ Spacer(Modifier.size(itemSize).testTag(it))
+ }
+ }
+ }
+
+ rule.onNodeWithTag("1")
+ .assertTopPositionInRootIsEqualTo(0.dp)
+
+ rule.onNodeWithTag("2")
+ .assertTopPositionInRootIsEqualTo(itemSize)
+
+ rule.onNodeWithTag("3")
+ .assertTopPositionInRootIsEqualTo(itemSize * 2)
+ }
+
+ @Test
+ fun usedWithArrayIndexed() {
+ val items = arrayOf("1", "2", "3")
+
+ val itemSize = with(rule.density) { 15.toDp() }
+
+ rule.setContent {
+ LazyColumn {
+ itemsIndexed(items) { index, item ->
+ Spacer(Modifier.size(itemSize).testTag("$index*$item"))
+ }
+ }
+ }
+
+ rule.onNodeWithTag("0*1")
+ .assertTopPositionInRootIsEqualTo(0.dp)
+
+ rule.onNodeWithTag("1*2")
+ .assertTopPositionInRootIsEqualTo(itemSize)
+
+ rule.onNodeWithTag("2*3")
+ .assertTopPositionInRootIsEqualTo(itemSize * 2)
+ }
+
private fun SemanticsNodeInteraction.assertTopPositionIsAlmost(expected: Dp) {
getUnclippedBoundsInRoot().top.assertIsEqualTo(expected, tolerance = 1.dp)
}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyGridTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyGridTest.kt
index af17e7f..3e6ca0b 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyGridTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyGridTest.kt
@@ -18,13 +18,16 @@
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.preferredHeight
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.preferredWidth
+import androidx.compose.foundation.layout.width
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.unit.dp
@@ -232,4 +235,72 @@
rule.onNodeWithTag("3")
.assertDoesNotExist()
}
+
+ @Test
+ fun usedWithArray() {
+ val items = arrayOf("1", "2", "3", "4")
+
+ val itemSize = with(rule.density) { 15.toDp() }
+
+ rule.setContent {
+ LazyVerticalGrid(
+ GridCells.Fixed(2),
+ Modifier.width(itemSize * 2)
+ ) {
+ items(items) {
+ Spacer(Modifier.height(itemSize).testTag(it))
+ }
+ }
+ }
+
+ rule.onNodeWithTag("1")
+ .assertTopPositionInRootIsEqualTo(0.dp)
+ .assertLeftPositionInRootIsEqualTo(0.dp)
+
+ rule.onNodeWithTag("2")
+ .assertTopPositionInRootIsEqualTo(0.dp)
+ .assertLeftPositionInRootIsEqualTo(itemSize)
+
+ rule.onNodeWithTag("3")
+ .assertTopPositionInRootIsEqualTo(itemSize)
+ .assertLeftPositionInRootIsEqualTo(0.dp)
+
+ rule.onNodeWithTag("4")
+ .assertTopPositionInRootIsEqualTo(itemSize)
+ .assertLeftPositionInRootIsEqualTo(itemSize)
+ }
+
+ @Test
+ fun usedWithArrayIndexed() {
+ val items = arrayOf("1", "2", "3", "4")
+
+ val itemSize = with(rule.density) { 15.toDp() }
+
+ rule.setContent {
+ LazyVerticalGrid(
+ GridCells.Fixed(2),
+ Modifier.width(itemSize * 2)
+ ) {
+ itemsIndexed(items) { index, item ->
+ Spacer(Modifier.height(itemSize).testTag("$index*$item"))
+ }
+ }
+ }
+
+ rule.onNodeWithTag("0*1")
+ .assertTopPositionInRootIsEqualTo(0.dp)
+ .assertLeftPositionInRootIsEqualTo(0.dp)
+
+ rule.onNodeWithTag("1*2")
+ .assertTopPositionInRootIsEqualTo(0.dp)
+ .assertLeftPositionInRootIsEqualTo(itemSize)
+
+ rule.onNodeWithTag("2*3")
+ .assertTopPositionInRootIsEqualTo(itemSize)
+ .assertLeftPositionInRootIsEqualTo(0.dp)
+
+ rule.onNodeWithTag("3*4")
+ .assertTopPositionInRootIsEqualTo(itemSize)
+ .assertLeftPositionInRootIsEqualTo(itemSize)
+ }
}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt
index ea14a36..ebdc093 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt
@@ -508,15 +508,13 @@
@Test
fun scrollsLeftInRtl() {
- val items = (1..4).map { it.toString() }
-
rule.setContent {
Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
Box(Modifier.preferredWidth(100.dp)) {
LazyRow(Modifier.testTag(LazyListTag)) {
- items(items) {
+ items(4) {
Spacer(
- Modifier.preferredWidth(101.dp).fillParentMaxHeight().testTag(it)
+ Modifier.preferredWidth(101.dp).fillParentMaxHeight().testTag("$it")
)
}
}
@@ -527,10 +525,10 @@
rule.onNodeWithTag(LazyListTag)
.scrollBy(x = (-150).dp, density = rule.density)
- rule.onNodeWithTag("1")
+ rule.onNodeWithTag("0")
.assertDoesNotExist()
- rule.onNodeWithTag("2")
+ rule.onNodeWithTag("1")
.assertIsDisplayed()
}
@@ -721,7 +719,6 @@
@Test
fun stateUpdatedAfterScroll() {
- val items by mutableStateOf((1..20).toList())
lateinit var state: LazyListState
rule.setContent {
state = rememberLazyListState()
@@ -729,7 +726,7 @@
Modifier.size(100.dp).testTag(LazyListTag),
state = state
) {
- items(items) {
+ items(20) {
Spacer(Modifier.size(20.dp).testTag("$it"))
}
}
@@ -758,7 +755,6 @@
@Test
fun stateUpdatedAfterScrollWithinTheSameItem() {
- val items by mutableStateOf((1..20).toList())
lateinit var state: LazyListState
rule.setContent {
state = rememberLazyListState()
@@ -766,7 +762,7 @@
Modifier.size(100.dp).testTag(LazyListTag),
state = state
) {
- items(items) {
+ items(20) {
Spacer(Modifier.size(20.dp).testTag("$it"))
}
}
@@ -788,13 +784,12 @@
@Test
fun initialScrollIsApplied() {
- val items by mutableStateOf((0..20).toList())
lateinit var state: LazyListState
val expectedOffset = with(rule.density) { 10.dp.toIntPx() }
rule.setContent {
state = rememberLazyListState(2, expectedOffset)
LazyRow(Modifier.size(100.dp).testTag(LazyListTag), state = state) {
- items(items) {
+ items(20) {
Spacer(Modifier.size(20.dp).testTag("$it"))
}
}
@@ -812,7 +807,6 @@
@Test
fun stateIsRestored() {
val restorationTester = StateRestorationTester(rule)
- val items by mutableStateOf((1..20).toList())
var state: LazyListState? = null
restorationTester.setContent {
state = rememberLazyListState()
@@ -820,7 +814,7 @@
Modifier.size(100.dp).testTag(LazyListTag),
state = state!!
) {
- items(items) {
+ items(20) {
Spacer(Modifier.size(20.dp).testTag("$it"))
}
}
@@ -845,7 +839,6 @@
@Test
fun snapToItemIndex() {
- val items by mutableStateOf((1..20).toList())
lateinit var state: LazyListState
rule.setContent {
state = rememberLazyListState()
@@ -853,7 +846,7 @@
Modifier.size(100.dp).testTag(LazyListTag),
state = state
) {
- items(items) {
+ items(20) {
Spacer(Modifier.size(20.dp).testTag("$it"))
}
}
@@ -870,11 +863,10 @@
@Test
fun itemsAreNotRedrawnDuringScroll() {
- val items = (0..20).toList()
val redrawCount = Array(6) { 0 }
rule.setContent {
LazyRow(Modifier.size(100.dp).testTag(LazyListTag)) {
- items(items) {
+ items(21) {
Spacer(
Modifier.size(20.dp)
.drawBehind { redrawCount[it]++ }
@@ -896,12 +888,11 @@
@Test
fun itemInvalidationIsNotCausingAnotherItemToRedraw() {
- val items = (0..1).toList()
val redrawCount = Array(2) { 0 }
var stateUsedInDrawScope by mutableStateOf(false)
rule.setContent {
LazyRow(Modifier.size(100.dp).testTag(LazyListTag)) {
- items(items) {
+ items(2) {
Spacer(
Modifier.size(50.dp)
.drawBehind {
@@ -986,6 +977,54 @@
.assertHeightIsEqualTo(30.dp)
}
+ @Test
+ fun usedWithArray() {
+ val items = arrayOf("1", "2", "3")
+
+ val itemSize = with(rule.density) { 15.toDp() }
+
+ rule.setContent {
+ LazyRow {
+ items(items) {
+ Spacer(Modifier.size(itemSize).testTag(it))
+ }
+ }
+ }
+
+ rule.onNodeWithTag("1")
+ .assertLeftPositionInRootIsEqualTo(0.dp)
+
+ rule.onNodeWithTag("2")
+ .assertLeftPositionInRootIsEqualTo(itemSize)
+
+ rule.onNodeWithTag("3")
+ .assertLeftPositionInRootIsEqualTo(itemSize * 2)
+ }
+
+ @Test
+ fun usedWithArrayIndexed() {
+ val items = arrayOf("1", "2", "3")
+
+ val itemSize = with(rule.density) { 15.toDp() }
+
+ rule.setContent {
+ LazyRow {
+ itemsIndexed(items) { index, item ->
+ Spacer(Modifier.size(itemSize).testTag("$index*$item"))
+ }
+ }
+ }
+
+ rule.onNodeWithTag("0*1")
+ .assertLeftPositionInRootIsEqualTo(0.dp)
+
+ rule.onNodeWithTag("1*2")
+ .assertLeftPositionInRootIsEqualTo(itemSize)
+
+ rule.onNodeWithTag("2*3")
+ .assertLeftPositionInRootIsEqualTo(itemSize * 2)
+ }
+
private fun LazyListState.scrollBy(offset: Dp) {
runBlocking {
smoothScrollBy(with(rule.density) { offset.toIntPx().toFloat() }, snap())
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
index 8e70fc1..e340491 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
@@ -29,33 +29,19 @@
*/
interface LazyListScope {
/**
- * Adds a list of items and their content to the scope.
- *
- * @param items the data list
- * @param itemContent the content displayed by a single item
- */
- fun <T> items(
- items: List<T>,
- itemContent: @Composable LazyItemScope.(item: T) -> Unit
- )
-
- /**
- * Adds a single item to the scope.
+ * Adds a single item.
*
* @param content the content of the item
*/
fun item(content: @Composable LazyItemScope.() -> Unit)
/**
- * Adds a list of items to the scope where the content of an item is aware of its index.
+ * Adds a [count] of items.
*
- * @param items the data list
+ * @param count the items count
* @param itemContent the content displayed by a single item
*/
- fun <T> itemsIndexed(
- items: List<T>,
- itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
- )
+ fun items(count: Int, itemContent: @Composable LazyItemScope.(index: Int) -> Unit)
/**
* Adds a sticky header item, which will remain pinned even when scrolling after it.
@@ -69,6 +55,58 @@
fun stickyHeader(content: @Composable LazyItemScope.() -> Unit)
}
+/**
+ * Adds a list of items.
+ *
+ * @param items the data list
+ * @param itemContent the content displayed by a single item
+ */
+inline fun <T> LazyListScope.items(
+ items: List<T>,
+ crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
+) = items(items.size) {
+ itemContent(items[it])
+}
+
+/**
+ * Adds a list of items where the content of an item is aware of its index.
+ *
+ * @param items the data list
+ * @param itemContent the content displayed by a single item
+ */
+inline fun <T> LazyListScope.itemsIndexed(
+ items: List<T>,
+ crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
+) = items(items.size) {
+ itemContent(it, items[it])
+}
+
+/**
+ * Adds an array of items.
+ *
+ * @param items the data array
+ * @param itemContent the content displayed by a single item
+ */
+inline fun <T> LazyListScope.items(
+ items: Array<T>,
+ crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
+) = items(items.size) {
+ itemContent(items[it])
+}
+
+/**
+ * Adds an array of items where the content of an item is aware of its index.
+ *
+ * @param items the data array
+ * @param itemContent the content displayed by a single item
+ */
+inline fun <T> LazyListScope.itemsIndexed(
+ items: Array<T>,
+ crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
+) = items(items.size) {
+ itemContent(it, items[it])
+}
+
internal class LazyListScopeImpl : LazyListScope {
private val intervals = IntervalList<LazyItemScope.(Int) -> (@Composable () -> Unit)>()
val totalSize get() = intervals.totalSize
@@ -82,13 +120,9 @@
return interval.content(scope, localIntervalIndex)
}
- override fun <T> items(
- items: List<T>,
- itemContent: @Composable LazyItemScope.(item: T) -> Unit
- ) {
- intervals.add(items.size) { index ->
- val item = items[index]
- @Composable { itemContent(item) }
+ override fun items(count: Int, itemContent: @Composable LazyItemScope.(index: Int) -> Unit) {
+ intervals.add(count) { index ->
+ @Composable { itemContent(index) }
}
}
@@ -96,16 +130,6 @@
intervals.add(1) { @Composable { content() } }
}
- override fun <T> itemsIndexed(
- items: List<T>,
- itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
- ) {
- intervals.add(items.size) { index ->
- val item = items[index]
- @Composable { itemContent(index, item) }
- }
- }
-
@ExperimentalFoundationApi
override fun stickyHeader(content: @Composable LazyItemScope.() -> Unit) {
val headersIndexes = headersIndexes ?: mutableListOf<Int>().also {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyFor.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyFor.kt
index 2bad2c3..87583812 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyFor.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyFor.kt
@@ -56,7 +56,8 @@
ReplaceWith(
"LazyColumn(modifier, state, contentPadding, horizontalAlignment = " +
"horizontalAlignment) { \n items(items, itemContent) \n }",
- "androidx.compose.foundation.lazy.LazyColumn"
+ "androidx.compose.foundation.lazy.LazyColumn",
+ "androidx.compose.foundation.lazy.items"
)
)
fun <T> LazyColumnFor(
@@ -117,7 +118,8 @@
ReplaceWith(
"LazyColumn(modifier, state, contentPadding, horizontalAlignment = " +
"horizontalAlignment) { \n itemsIndexed(items, itemContent) \n }",
- "androidx.compose.foundation.lazy.LazyColumn"
+ "androidx.compose.foundation.lazy.LazyColumn",
+ "androidx.compose.foundation.lazy.itemsIndexed"
)
)
fun <T> LazyColumnForIndexed(
@@ -175,7 +177,8 @@
ReplaceWith(
"LazyRow(modifier, state, contentPadding, verticalAlignment = " +
"verticalAlignment) { \n items(items, itemContent) \n }",
- "androidx.compose.foundation.lazy.LazyColumn"
+ "androidx.compose.foundation.lazy.LazyRow",
+ "androidx.compose.foundation.lazy.items"
)
)
fun <T> LazyRowFor(
@@ -235,7 +238,8 @@
ReplaceWith(
"LazyRow(modifier, state, contentPadding, verticalAlignment = " +
"verticalAlignment) { \n itemsIndexed(items, itemContent) \n }",
- "androidx.compose.foundation.lazy.LazyColumn"
+ "androidx.compose.foundation.lazy.LazyRow",
+ "androidx.compose.foundation.lazy.itemsIndexed"
)
)
fun <T> LazyRowForIndexed(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyGrid.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyGrid.kt
index a4bc0b6..4dda9f3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyGrid.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyGrid.kt
@@ -107,17 +107,6 @@
*/
interface LazyGridScope {
/**
- * Adds a list of items and their content to the scope.
- *
- * @param items the data list
- * @param itemContent the content displayed by a single item
- */
- fun <T> items(
- items: List<T>,
- itemContent: @Composable LazyItemScope.(item: T) -> Unit
- )
-
- /**
* Adds a single item to the scope.
*
* @param content the content of the item
@@ -125,15 +114,64 @@
fun item(content: @Composable LazyItemScope.() -> Unit)
/**
- * Adds a list of items to the scope where the content of an item is aware of its index.
+ * Adds a [count] of items.
*
- * @param items the data list
+ * @param count the items count
* @param itemContent the content displayed by a single item
*/
- fun <T> itemsIndexed(
- items: List<T>,
- itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
- )
+ fun items(count: Int, itemContent: @Composable LazyItemScope.(index: Int) -> Unit)
+}
+
+/**
+ * Adds a list of items.
+ *
+ * @param items the data list
+ * @param itemContent the content displayed by a single item
+ */
+inline fun <T> LazyGridScope.items(
+ items: List<T>,
+ crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
+) = items(items.size) {
+ itemContent(items[it])
+}
+
+/**
+ * Adds a list of items where the content of an item is aware of its index.
+ *
+ * @param items the data list
+ * @param itemContent the content displayed by a single item
+ */
+inline fun <T> LazyGridScope.itemsIndexed(
+ items: List<T>,
+ crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
+) = items(items.size) {
+ itemContent(it, items[it])
+}
+
+/**
+ * Adds an array of items.
+ *
+ * @param items the data array
+ * @param itemContent the content displayed by a single item
+ */
+inline fun <T> LazyGridScope.items(
+ items: Array<T>,
+ crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
+) = items(items.size) {
+ itemContent(items[it])
+}
+
+/**
+ * Adds an array of items where the content of an item is aware of its index.
+ *
+ * @param items the data array
+ * @param itemContent the content displayed by a single item
+ */
+inline fun <T> LazyGridScope.itemsIndexed(
+ items: Array<T>,
+ crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
+) = items(items.size) {
+ itemContent(it, items[it])
}
@Composable
@@ -204,27 +242,13 @@
return interval.content(scope, localIntervalIndex)
}
- override fun <T> items(
- items: List<T>,
- itemContent: @Composable LazyItemScope.(item: T) -> Unit
- ) {
- intervals.add(items.size) { index ->
- val item = items[index]
- @Composable { itemContent(item) }
- }
- }
-
override fun item(content: @Composable LazyItemScope.() -> Unit) {
intervals.add(1) { @Composable { content() } }
}
- override fun <T> itemsIndexed(
- items: List<T>,
- itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
- ) {
- intervals.add(items.size) { index ->
- val item = items[index]
- @Composable { itemContent(index, item) }
+ override fun items(count: Int, itemContent: @Composable LazyItemScope.(index: Int) -> Unit) {
+ intervals.add(count) {
+ @Composable { itemContent(it) }
}
}
}
diff --git a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
index 010d2cb..e4b4751 100644
--- a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
+++ b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
@@ -24,6 +24,7 @@
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
+import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Providers
diff --git a/compose/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/lazy/LazyListScrollingBenchmark.kt b/compose/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/lazy/LazyListScrollingBenchmark.kt
index 8e652ac..a61b285 100644
--- a/compose/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/lazy/LazyListScrollingBenchmark.kt
+++ b/compose/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/lazy/LazyListScrollingBenchmark.kt
@@ -25,6 +25,8 @@
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyRow
+import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.runtime.emptyContent
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Layout.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Layout.kt
index 07e9583..c60f710 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Layout.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Layout.kt
@@ -30,6 +30,7 @@
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
import androidx.compose.material.Button
import androidx.compose.material.Scaffold
import androidx.compose.material.Surface
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/mentalmodel/MentalModel.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/mentalmodel/MentalModel.kt
index 635fbdf..8f16fb4 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/mentalmodel/MentalModel.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/mentalmodel/MentalModel.kt
@@ -24,6 +24,7 @@
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
import androidx.compose.material.Button
import androidx.compose.material.Checkbox
import androidx.compose.material.Divider
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyColumnActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyColumnActivity.kt
index d981bab..ed81847 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyColumnActivity.kt
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/LazyColumnActivity.kt
@@ -23,6 +23,7 @@
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
import androidx.compose.material.Card
import androidx.compose.material.Checkbox
import androidx.compose.material.Text
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BackdropScaffoldSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BackdropScaffoldSamples.kt
index 0294cad..368287d 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BackdropScaffoldSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/BackdropScaffoldSamples.kt
@@ -86,13 +86,13 @@
},
backLayerContent = {
LazyColumn {
- for (i in 1..5) item {
+ items(5) {
ListItem(
Modifier.clickable {
- selection.value = i
+ selection.value = it
scaffoldState.conceal()
},
- text = { Text("Select $i") }
+ text = { Text("Select $it") }
)
}
}
@@ -100,9 +100,9 @@
frontLayerContent = {
Text("Selection: ${selection.value}")
LazyColumn {
- for (i in 1..50) item {
+ items(50) {
ListItem(
- text = { Text("Item $i") },
+ text = { Text("Item $it") },
icon = { Icon(Icons.Default.Favorite) }
)
}
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ModalBottomSheetSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ModalBottomSheetSamples.kt
index 7261692..9c63c0e 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ModalBottomSheetSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ModalBottomSheetSamples.kt
@@ -47,9 +47,9 @@
sheetState = state,
sheetContent = {
LazyColumn {
- for (i in 1..50) item {
+ items(50) {
ListItem(
- text = { Text("Item $i") },
+ text = { Text("Item $it") },
icon = { Icon(Icons.Default.Favorite) }
)
}
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeToDismissSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeToDismissSamples.kt
index 87bb647..4a896c29 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeToDismissSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeToDismissSamples.kt
@@ -24,6 +24,7 @@
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
import androidx.compose.material.Card
import androidx.compose.material.DismissDirection.EndToStart
import androidx.compose.material.DismissDirection.StartToEnd
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt
index 8cdb4b7..03d0312 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt
@@ -67,7 +67,7 @@
.size(200.dp)
.background(color = Color.White)
) {
- items(List(100) { index -> index }) {
+ items(100) {
val pointerCount = remember { mutableStateOf(0) }
Box(
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollSamples.kt
index 70101f9..224d685 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollSamples.kt
@@ -134,7 +134,7 @@
) {
// hypothetical scrollable child which we will listen in connection above
LazyColumn {
- items(listOf(1, 2, 3, 4, 5)) {
+ items(5) {
Text(
"Magenta text above will change first when you scroll me",
modifier = Modifier.padding(5.dp)
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt
index 1c5ef6e..9bac865 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt
@@ -30,6 +30,7 @@
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.ExperimentalComposeApi
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
diff --git a/paging/paging-compose/src/main/java/androidx/paging/compose/LazyPagingItems.kt b/paging/paging-compose/src/main/java/androidx/paging/compose/LazyPagingItems.kt
index f6b3ac0..e0cddcb 100644
--- a/paging/paging-compose/src/main/java/androidx/paging/compose/LazyPagingItems.kt
+++ b/paging/paging-compose/src/main/java/androidx/paging/compose/LazyPagingItems.kt
@@ -237,7 +237,7 @@
@Suppress("UNUSED_VARIABLE")
val recomposerPlaceholder = lazyPagingItems.recomposerPlaceholder.value
- items((0 until lazyPagingItems.itemCount).toList()) { index ->
+ items(lazyPagingItems.itemCount) { index ->
val item = lazyPagingItems[index]
itemContent(item)
}
@@ -265,8 +265,8 @@
@Suppress("UNUSED_VARIABLE")
val recomposerPlaceholder = lazyPagingItems.recomposerPlaceholder.value
- items((0 until lazyPagingItems.itemCount).toList()) { index ->
+ items(lazyPagingItems.itemCount) { index ->
val item = lazyPagingItems[index]
itemContent(index, item)
}
-}
\ No newline at end of file
+}