JetPack同时组成多个懒惰的滚动

发布于 2025-02-12 14:20:18 字数 1574 浏览 1 评论 0原文

我想同时使用多个懒惰的卷轴,

因为内部布局两个布局是不同的,所以我不能使用lazyhorizo​​ntalgrid或lazyverticalgrid。 我如何在多个懒惰的滚动中分享滚动?

@Composable
fun TableScreen2(list: List<Time>, cal: Calendar, df: DateFormat) {

    LazyRow(Modifier.fillMaxSize()) {
        item {
            LazyColumn(
                modifier = Modifier
                    .fillParentMaxHeight()
            ) {
                items(count = list.first().timeList.size / 2) {
                    Column(
                        modifier = Modifier
                            .width(60.dp)
                            .height(50.dp),
                        verticalArrangement = Arrangement.Top
                    ) {

                        Text(df.format(stateCal.time))
                        stateCal.add(Calendar.MINUTE, 30)

                    }
                }
            }
        }

        items(4) { listIndex ->
            LazyColumn(modifier = Modifier.fillParentMaxHeight()) {
                itemsIndexed(list[listIndex].timeList) { timeIndex, timeItem ->
                    Box(
                        modifier = Modifier
                            .height(30.dp)
                            .width(60.dp)
                            .background(Color.Gray),
                        contentAlignment = Alignment.Center
                    ) {
                        Text(text = "$timeIndex")
                    }
                }

            }
        }
    }
}

这是gif

I want multiple All LazyColumn scroll simultaneously

I can't use LazyHorizontalGrid or LazyVerticalGrid because of inner layout what two layout is different.
How can i share scrolling in multiple LazyColumn?

@Composable
fun TableScreen2(list: List<Time>, cal: Calendar, df: DateFormat) {

    LazyRow(Modifier.fillMaxSize()) {
        item {
            LazyColumn(
                modifier = Modifier
                    .fillParentMaxHeight()
            ) {
                items(count = list.first().timeList.size / 2) {
                    Column(
                        modifier = Modifier
                            .width(60.dp)
                            .height(50.dp),
                        verticalArrangement = Arrangement.Top
                    ) {

                        Text(df.format(stateCal.time))
                        stateCal.add(Calendar.MINUTE, 30)

                    }
                }
            }
        }

        items(4) { listIndex ->
            LazyColumn(modifier = Modifier.fillParentMaxHeight()) {
                itemsIndexed(list[listIndex].timeList) { timeIndex, timeItem ->
                    Box(
                        modifier = Modifier
                            .height(30.dp)
                            .width(60.dp)
                            .background(Color.Gray),
                        contentAlignment = Alignment.Center
                    ) {
                        Text(text = "$timeIndex")
                    }
                }

            }
        }
    }
}

here is gif

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

顾冷 2025-02-19 14:20:18

我不知道您是否还需要帮助。

// Add the data set
val channels = ArrayList<String>()
val programs = mutableListOf<List<ArrayList<String>>>()
for (channel in 1..400) {
        channels.add("C $channel")
    }
    for (j in 1..400) {
        val arrayList = ArrayList<String>()
        for (i in 1..400) {
            arrayList.add("Program ${j}${i}")
        }
        programs.add(listOf(arrayList))
    }


@Composable
fun ChannelFilter() {
    LazyColumn(modifier = Modifier.fillMaxHeight()) {
        items(channels.size) { index ->
            Text(text = channels[index], modifier = Modifier.padding(30.dp))
        }
    }
}

@Composable
fun T1ProgramList() {
    Box(Modifier.horizontalScroll(rememberScrollState())) {
        LazyColumn(modifier = Modifier.fillMaxHeight()) {
            items(programs, { row -> row.hashCode() }) { row ->
                Row(modifier = Modifier.padding(vertical = 30.dp)) {
                    row.forEach { col ->
                        Text(text = "$col", modifier = Modifier.padding(horizontal = 16.dp))
                    }
                }
            }
        }
    }
}

@Composable
fun ChannelAndProgramLayout() {
    Row(modifier = Modifier.fillMaxSize()) {
        Column(modifier = Modifier.weight(1f)) {
            Text(
                text = "Channels",
                modifier = Modifier.padding(8.dp)
            )
            ChannelFilter()
        }
        Column(modifier = Modifier.weight(3f)) {
            Text(
                text = "T1 Programs",
                modifier = Modifier.padding(8.dp)
            )
            T1ProgramList()
        }
    }
}

I don't know if still you need help on this.

// Add the data set
val channels = ArrayList<String>()
val programs = mutableListOf<List<ArrayList<String>>>()
for (channel in 1..400) {
        channels.add("C $channel")
    }
    for (j in 1..400) {
        val arrayList = ArrayList<String>()
        for (i in 1..400) {
            arrayList.add("Program ${j}${i}")
        }
        programs.add(listOf(arrayList))
    }


@Composable
fun ChannelFilter() {
    LazyColumn(modifier = Modifier.fillMaxHeight()) {
        items(channels.size) { index ->
            Text(text = channels[index], modifier = Modifier.padding(30.dp))
        }
    }
}

@Composable
fun T1ProgramList() {
    Box(Modifier.horizontalScroll(rememberScrollState())) {
        LazyColumn(modifier = Modifier.fillMaxHeight()) {
            items(programs, { row -> row.hashCode() }) { row ->
                Row(modifier = Modifier.padding(vertical = 30.dp)) {
                    row.forEach { col ->
                        Text(text = "$col", modifier = Modifier.padding(horizontal = 16.dp))
                    }
                }
            }
        }
    }
}

@Composable
fun ChannelAndProgramLayout() {
    Row(modifier = Modifier.fillMaxSize()) {
        Column(modifier = Modifier.weight(1f)) {
            Text(
                text = "Channels",
                modifier = Modifier.padding(8.dp)
            )
            ChannelFilter()
        }
        Column(modifier = Modifier.weight(3f)) {
            Text(
                text = "T1 Programs",
                modifier = Modifier.padding(8.dp)
            )
            T1ProgramList()
        }
    }
}
扛刀软妹 2025-02-19 14:20:18

一个懒惰的单个条目,懒惰列中的每个条目是5个项目的一行,看起来适合您想要的东西。

A single LazyColumn, where each entry in the lazy column is a row of 5 items looks like it would fit what you want.

弄潮 2025-02-19 14:20:18

我将Shyak DAS的代码更新为2个卷轴以同步

将其添加到ChannelAndProgramlayout()

val stateRowX = rememberLazyListState()
val stateRowY = rememberLazyListState()

LaunchedEffect(stateRowX.firstVisibleItemScrollOffset) {
    stateRowY.scrollToItem(
        stateRowX.firstVisibleItemIndex,
        stateRowX.firstVisibleItemScrollOffset
    )
}

LaunchedEffect(stateRowY.firstVisibleItemScrollOffset) {
    stateRowX.scrollToItem(
        stateRowY.firstVisibleItemIndex,
        stateRowY.firstVisibleItemScrollOffset
    )
}

,然后添加到Channelfilter()

LazyColumn(modifier = Modifier.fillMaxHeight(), state = stateRowX) 

和T1Programlist(),

LazyColumn(modifier = Modifier.fillMaxHeight(), state = stateRowY)

请感谢Shyak das

I update the code from Shyak Das for the 2 scrolls to sync

add this to ChannelAndProgramLayout()

val stateRowX = rememberLazyListState()
val stateRowY = rememberLazyListState()

LaunchedEffect(stateRowX.firstVisibleItemScrollOffset) {
    stateRowY.scrollToItem(
        stateRowX.firstVisibleItemIndex,
        stateRowX.firstVisibleItemScrollOffset
    )
}

LaunchedEffect(stateRowY.firstVisibleItemScrollOffset) {
    stateRowX.scrollToItem(
        stateRowY.firstVisibleItemIndex,
        stateRowY.firstVisibleItemScrollOffset
    )
}

and then add to ChannelFilter()

LazyColumn(modifier = Modifier.fillMaxHeight(), state = stateRowX) 

and to T1ProgramList()

LazyColumn(modifier = Modifier.fillMaxHeight(), state = stateRowY)

Thanks Shyak Das

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文