首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jetpack组合嵌套LazyColumn

Jetpack组合嵌套LazyColumn
EN

Stack Overflow用户
提问于 2022-05-17 09:55:58
回答 1查看 2.1K关注 0票数 1

如何在Jetpack撰写中构建这个UI?假设我需要一个惰性列作为过滤器标题,然后另一个嵌套的惰性列用于实际过滤器,但是由于jetpack组合不允许嵌套懒惰列,那么构建它的替代方法是什么?

即使我指定第二列或第一列的高度,里面的内容也可能不合适。

EN

回答 1

Stack Overflow用户

发布于 2022-05-17 10:52:34

编辑:最好使用Pylyp,link to comment建议的选项。

Hacky :您可以通过添加嵌套Column进行黑客攻击。请看一下伪代码:

代码语言:javascript
复制
@Composable
fun Screen(
    items: List<Item>,
) {
    // Here we store each state of expandable item
    val expandStates = remember(items.size) {
        List(items.size) { mutableStateOf(false) }
    }

    LazyColumn {
        itemsIndexed(items, { _, it -> it.key }) { idx, item ->
            ExpandableItem(
                modifier = Modifier.fillMaxWidth(),
                item = item.expandable,
                isExpanded = expandStates[idx].value,
            )
        }
    }
}

@Composable
private fun ExpandableItem(
    item: Item,
    isExpanded: Boolean,
    modifier: Modifier = Modifier,
) {
    Column(modifier = modifier.animateContentSize()) {
        Row(
            modifier = Modifier.height(50.dp),
            verticalAlignment = Alignment.CenterVertically
        ) {
            Text(modifier = Modifier.weight(1f), text = item.title)
            val icon = if (isExpanded) R.drawable.ic_minus else R.drawable.ic_plus
            Icon(
                modifier = Modifier.padding(horizontal = 16.dp),
                painter = painterResource(icon),
                contentDescription = null
            )
        }
        if (isExpanded) Column {
            item.values.forEach { item ->
                ValueItem(
                    modifier = Modifier.fillMaxWidth(),
                    item = item,
                )
            }
        }
    }
}

@Composable
private fun ValueItem(
    item: Item,
    modifier: Modifier = Modifier,
) {
    Column(modifier = modifier) {
        Row(
            modifier = Modifier
                .height(50.dp)
                .padding(start = 16.dp),
            verticalAlignment = Alignment.CenterVertically
        ) {
            Text(
                modifier = Modifier.weight(1f),
                text = item.name,
                maxLines = 1,
                overflow = TextOverflow.Ellipsis
            )
        }
    }
}

在上面的示例中,Item代表了特定情况下的一些抽象内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72271868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档