Android Jetpack Compose如何实现列表吸顶效果

发布时间:2022-02-23 09:14:45 作者:iii
来源:亿速云 阅读:399

这篇文章主要介绍“Android Jetpack Compose如何实现列表吸顶效果”,在日常操作中,相信很多人在Android Jetpack Compose如何实现列表吸顶效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android Jetpack Compose如何实现列表吸顶效果”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

安卓传统的 Recyclerview 打造悬浮头部StickyHeader的吸顶效果,十分麻烦,而在Compose中就简单多了

stickyHeader

Compose设计的时候考虑得很周到,他们提供了stickyHeader

作用就是添加一个粘性标题项,即使在它后面滚动时也会保持固定。标头将保持固定,直到下一个标头取而代之。

参数key - 表示唯一的密钥键。

它不允许对列表出现使用相同的键。密钥的类型应该可以通过 Bundle 保存。如果传递了 null,则列表中的位置将代表键。当指定键时,滚动位置将基于该键保持,这意味着如果在当前可见项目之前添加删除项目,则具有给定键的项目将保留为第一个可见项目。

参数content 传入Composable控件就即可显示

实体类

创建一个实体类标题和内容

data class Post(
    val title:String,
    val contentData:List<String>
)

加载假数据

val list : MutableList<Post> = mutableListOf()
for (index in 1..10) {
    val contentData :MutableList<String> = mutableListOf()
    for (i in 1..30){
        contentData.add("内容 $i")
    }
    list.add(Post("标题$index",contentData))
}

定义一个垂直滚动列表,仅构成和布局当前可见的项目

LazyColumn {
    list.forEachIndexed { position, post ->
        stickyHeader {
            ListTitle(title = post.title)
        }

        items(post.contentData.size) { route ->
            StructureItem(post.contentData)
        }
        if (position <= list.size - 1) {
            Divider()
        }
        Spacer(modifier = Modifier.height(10.dp))
    }
}

吸顶标题

接着封装一个吸顶标题,并传出点击事件

@Composable
fun ListTitle(
    onSubtitleClick: () -> Unit = {}
) {
        MediumTitle(
            title = title,
            modifier = Modifier.align(Alignment.CenterVertically).clickable {
                onSubtitleClick.invoke()
            }
}

效果图

Android Jetpack Compose如何实现列表吸顶效果

二级条目

接着写二级条目

FlowRow可以将其子项置于水平流中的可组合项。如果水平空间太小而无法将所有子项放在一行中,则可能会使用多行。传统的流式布局

用法很简单,和row一样

FlowRow {
    for (item in bean) {
        TextButton(
           ....
        }
    }
}

在content可组控件里面添加多个TextButton即可

fun StructureItem{
    Column{
        FlowRow() {
            for (item in bean) {
                TextButton
                {
                    Text()
                }

            }
        }

    }
}

效果图

Android Jetpack Compose如何实现列表吸顶效果

接着吸顶标题放在LazyColumn里面就完成了

LazyColumn() {
    list.forEachIndexed { position, post ->
        stickyHeader {
            ListTitle(title = post.title) {
                //点击事件
            }
        }
        item {
            StructureItem(post.contentData)
            Spacer(modifier = Modifier.height(10.dp))
        }
    }
}

完整代码

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun StickyHeaderScreen() {
    val list: MutableList<Post> = mutableListOf()
    for (index in 1..10) {
        val contentData: MutableList<String> = mutableListOf()
        for (i in 1..12) {
            contentData.add("内容 $i")
        }
        list.add(Post("标题$index", contentData))
    }
    LazyColumn(
        modifier = Modifier
            .fillMaxWidth()
            .fillMaxHeight(),
        contentPadding = PaddingValues(vertical = 10.dp)
    ) {
        list.forEachIndexed { position, post ->
            stickyHeader {
                ListTitle(title = post.title) {
                    //点击事件
                }
            }
            item {
                StructureItem(post.contentData)
                Spacer(modifier = Modifier.height(10.dp))
            }
        }
    }
}

data class Post(
    val title: String,
    val contentData: List<String>
)

@Composable
fun ListTitle(
    modifier: Modifier = Modifier,
    title: String,
    isLoading: Boolean = false,
    onSubtitleClick: () -> Unit = {}
) {
    Row(
        modifier = modifier
            .placeholder(false)
            .fillMaxWidth()
            .height(ListTitleHeight)
            .background(color = Color.Gray)
    ) {
        Box(
            modifier = Modifier
                .padding(horizontal = 10.dp)
                .width(5.dp)
                .height(16.dp)
                .align(Alignment.CenterVertically)
                .background(color = Color.Black)
        )
        MediumTitle(
            title = title,
            color = Color.Black,
            modifier = Modifier.align(Alignment.CenterVertically).clickable {
                onSubtitleClick.invoke()
            },
            isLoading = isLoading
        )
        Spacer(modifier = Modifier.weight(1f))
    }

}


@Composable
fun StructureItem(
    bean: List<String>
) {
    Column(
        modifier = Modifier
            .fillMaxWidth()
            .padding(top = 10.dp)
    ) {

        FlowRow(
            modifier = Modifier.padding(horizontal = 6.dp)
        ) {


            for (item in bean) {
                Box(modifier = Modifier.padding(horizontal = 2.dp, vertical = 3.dp)) {
                    TextButton(
                        modifier = Modifier.padding(horizontal = 3.dp).height(34.dp),
                        shape = RoundedCornerShape(12.dp),
                        onClick = { },
                        colors = ButtonDefaults.textButtonColors(
                            backgroundColor = themeColor
                        )
                    )
                    {
                        Text(
                            item,
                            color = Color.White
                        )
                    }

                }
            }
        }

    }
}

效果图

Android Jetpack Compose如何实现列表吸顶效果

到此,关于“Android Jetpack Compose如何实现列表吸顶效果”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. UWP中如何使用Composition API实现吸顶
  2. 微信小程序实现吸顶特效

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

android jetpack compose

上一篇:如何使用jquery库实现电梯导航效果

下一篇:如何基于MySQL在磁盘上存储NULL值

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》