标签: lazycolumn

撰写:LazyColumn 在单个项目更新时重组所有项目

我正在尝试使用 LazyColumn 在列表中显示订单列表。这是代码:

@Composable
private fun MyOrders(
    orders: List<Order>?,
    onClick: (String, OrderStatus) -> Unit
) {
    orders?.let {
        LazyColumn {
            items(
                items = it,
                key = { it.id }
            ) {
                OrderDetails(it, onClick)
            }
        }
    }
}

@Composable
private fun OrderDetails(
    order: Order,
    onClick: (String, OrderStatus) -> Unit
) {
    println("Composing Order Item")
    // Item Code Here
}
Run Code Online (Sandbox Code Playgroud)

这是我称之为可组合项的方法:

orderVm.fetchOrders()
val state by orderVm.state.collectAsState(OrderState.Empty)

if (state.orders.isNotEmpty()) {
    MyOrders(state.orders) {
        // Handle status change click listener
    }
}
Run Code Online (Sandbox Code Playgroud)

我获取所有订单并显示在 LazyColumn 中。但是,当更新单个订单时,整个 …

android-jetpack-compose lazycolumn

7
推荐指数
1
解决办法
3371
查看次数

Jetpack Compose 中的粘性标题(如 Android 联系人)

我没有找到任何方法可以将 StickyHeader 与 LazyColumn 中的项目放在同一行:

内联粘性标题

因此,我使用 Box 将字母及其背景放在 LazyColumn 顶部,并使用 LazyListState 将其放在正确的位置:

@Preview
@Composable
fun InlineStickyList() {
    val unsorted = listOf(...) // Pair("FirstName","LastName")
    val data = unsorted.sortedBy { it.second[0] }
    val groups = data.groupBy { it.second[0] }

    @Composable
    fun Person(pair: Pair<String, String>, showLetter: Boolean) {
        Row(
            modifier = Modifier
                .fillMaxWidth()
                .background(Color.White),
            verticalAlignment = Alignment.CenterVertically
        ) {
            Text(
                "${pair.second[0]}",
                modifier = Modifier
                    .padding(10.dp)
                    .alpha(if (showLetter) 1f else 0f),
                fontSize = 20.sp
            )
            Text("${pair.first} ${pair.second}")
        }
    }

    val state = rememberLazyListState()
    Box(modifier …
Run Code Online (Sandbox Code Playgroud)

header sticky android-jetpack-compose lazycolumn

7
推荐指数
1
解决办法
3618
查看次数

当reverseLayout = false时启用LazyColumn自动滚动到底部

我有一个 LazyColumn 保存一些项目。我听了来自 Room 的 Flow,一切都很好reverseLayout = true。当新项目插入数据库时​​,LazyColumn 滚动到底部并显示最后一个项目。但reverseLayout = true也会反转标题。所以我用 禁用了它reverseLayout = false。这不起作用,因为当插入项目时,它会显示在列表中,但列表不会滚动以显示底部项目。我必须手动滚动。

当 LazyColumn 因更改而重组时,如何滚动到底部项目items

我认为我不需要放置代码,因为使用 LazyColumn 时都会出现问题,但如果这很重要,请告诉我,我可以编辑代码并发布它们!

android-jetpack-compose lazycolumn

7
推荐指数
1
解决办法
1万
查看次数

Jetpack Compose BottomSheetScaffoldsheetGestures已禁用,但当子组件可滚动时手势仍然有效

我的 Android 应用程序内部有一个BottomSheetScaffold如下所示的内容:

 BottomSheetScaffold(
        sheetGesturesEnabled = false,
        sheetContent = { MyContent() },
        scaffoldState = bottomSheetScaffoldState,
    ) {
        ..
    }
Run Code Online (Sandbox Code Playgroud)

设置为sheetGesturesEnabledfalse,工作表不应可滑动。但是,如果MyContent()包含像 之类的可滚动组件LazyColumn,则仍然可以在模态底部表单上执行滑动关闭手势。

这怎么可能?这是一个已知的错误吗?有什么解决办法吗?

android kotlin bottom-sheet android-jetpack-compose lazycolumn

6
推荐指数
1
解决办法
3057
查看次数

AdManagerAdView 在 LazyColumn 中离开屏幕时不渲染广告图像

我将 AdManagerAdView 包装在 AndroidView 中,以便可以在 Jetpack Compose 中使用它。当我在 LazyColumn 中使用图像时,图像无法加载,并且 AdManagerAdView 尝试在可组合项出现在屏幕上之前加载图像。

如果我快速滚动到该元素,那么 LazyColumn 将其组合起来,并且在图像从广告服务器返回之前它就出现在屏幕上,它会按预期工作。

LazyColumn {
        items(5) {
            SomeOtherComposable(it)
        }

        item {
            AndroidView(
                modifier = Modifier
                    .width(300.dp)
                    .height(250.dp)
                    .background(Color.Green),
                factory = { context ->
                    val adView = AdManagerAdView(context)
                    adView.adSize = AdSize.MEDIUM_RECTANGLE
                    adView.adUnitId = adUnitId
                    adView.loadAd(Builder().build())
                    adView
                }
            )
        }

        items(5) {
            SomeOtherComposable(it)
        }
}
Run Code Online (Sandbox Code Playgroud)

出于演示目的...

@Composable
fun SomeOtherComposable(i: Int) {
    Text(
        text = "SomeOtherComposable $i",
        modifier = Modifier
            .fillMaxWidth()
            .height(320.dp)
            .background(Color.White)
    )
}
Run Code Online (Sandbox Code Playgroud)

如果在非延迟列或任何其他 Compose 布局中使用包装的 AdManagerAdView,这也可以正常工作。

This …

adview android-jetpack-compose android-jetpack-compose-list lazycolumn

6
推荐指数
1
解决办法
1140
查看次数

单选 - 惰性列中的取消选择

问题::: 我想创建一个惰性列,一次只能选择或取消选择一个选项。现在,每当我单击惰性列内的行组件时,所有行都会被选中。

代码 :::

@Composable
fun LazyColumnWithSelection() {

    var isSelected by remember {
        mutableStateOf(false)
    }
    
    var selectedIndex by remember { mutableStateOf(0) }
    
    val onItemClick = { index: Int -> selectedIndex = index }

    LazyColumn(
        modifier = Modifier.fillMaxSize(),
    ) {
        items(100) { index ->

            Row(modifier = Modifier
                .fillMaxWidth()
                .clickable {
                    onItemClick.invoke(index)
                    if (selectedIndex == index) {
                        isSelected = !isSelected
                    }
                }
                .padding(16.dp),
                horizontalArrangement = Arrangement.SpaceBetween,
                verticalAlignment = Alignment.CenterVertically) {
                Text(text = "Item $index", modifier = Modifier.padding(12.dp), color = Color.White)
                if (isSelected) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack android-jetpack-compose lazycolumn

6
推荐指数
1
解决办法
1044
查看次数

如何在 Android Jetpack compose 中对列表初始人口进行动画处理

我当前的 Android Jetpack Compose 项目包含许多列表和网格。

我想对列表和网格的初始填充进行动画处理,为我的应用程序带来一些活力。

我找到了用于在列表中插入、删除项目等的文档。

但是,当列表首次显示时,我找不到任何动画细节。

首次填充列表或网格时是否可以添加动画?

android android-jetpack-compose lazycolumn jetpack-compose-animation

6
推荐指数
1
解决办法
2039
查看次数

LazyColumn StickyFooter 或将焦点放在底部项目上

我想创建一个小信使,其中的消息从底部添加(新消息放置在列表的底部)。为了实现这一点,我将LazyColumnsreversedLayout属性设置为true。但如果我这样做,粘性标题也会被反转(就像粘性页脚一样)。如果我将属性设置verticalArrangement为, Bottom那么当键盘打开时,下面的消息不会保持焦点(它将转到下面的键盘)。此外,消息列表不是从最新的消息开始,而是从最旧的消息开始(就像从顶部开始滚动一样)。

StickyFooter 或将焦点保持在底部项目可以解决问题吗?我能为此做什么?

我写的代码:

LazyColumn(
    modifier = Modifier
        .fillMaxWidth()
        .weight(1f),
    contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp),
    reverseLayout = true,
) {
    val messages = state.messages.asReversed()
    messages.forEachIndexed { index, message ->
        val nextMessage = messages.getOrNull(index - 1)
        val prevMessage = messages.getOrNull(index + 1)
        val isNearToPrevious = isNear(message, prevMessage)
        val isNearToNext = isNear(message, nextMessage)
        item(message.id) {
            GroupMessageItem(
                message,
                isNearToPrevious,
                isNearToNext
            )
        }
        if (!message.createdAt.isSameDayWith(prevMessage?.createdAt)) {
            stickyHeader(key = "item: ${message.id}") { …
Run Code Online (Sandbox Code Playgroud)

android-jetpack-compose lazycolumn

6
推荐指数
0
解决办法
541
查看次数

Android jetpack 中带有 ConstraintLayout 的 LazyColumn 组合

我将在每列的顶部放置一个标签,并Lazy\xd0\xa1olumn在底部放置一个标签。如下。

\n

在此输入图像描述

\n

然而,当我填写完后,却出现了与我预想不同的画面:

\n

在此输入图像描述

\n

我还需要设置什么吗?这是我的代码

\n
@Composable\nfun MenuDetailList(\n    loading: Boolean,\n    type: String,\n    items: List<Any>,\n    page: Int,\n    onChangeScrollPosition: (Int) -> Unit,\n    onTriggerNextPage: () -> Unit,\n    onCallCacheDialog: (Int) -> Unit\n) {\n    val configuration = LocalConfiguration.current\n    val screenHeight = configuration.screenHeightDp.dp\n\n    Box(\n        modifier = Modifier\n            .background(color = MaterialTheme.colors.surface)\n    ) {\n        if (loading && items.isEmpty()) {\n            LoadingShimmer(imageHeight = screenHeight)\n        }else if (items.isEmpty()) {\n            NothingHere()\n        }else {\n            ConstraintLayout(\n                modifier = Modifier\n                    .fillMaxSize()\n                    .background(color = Color.White)\n            ) {\n                val (label, list) = createRefs()\n …
Run Code Online (Sandbox Code Playgroud)

kotlin android-jetpack-compose lazycolumn

5
推荐指数
2
解决办法
1796
查看次数

如何计算最后一个可见项目后惰性列中的空白空间

如何计算 Jetpack compose 中最后一个可见项目之后惰性列中的空白空间。

在此输入图像描述

android android-jetpack android-jetpack-compose lazycolumn

5
推荐指数
1
解决办法
1027
查看次数