Compose竖向列表LazyColumn

news2025/1/17 13:49:05

基础列表一

LazyColumn组件中用items加载数据,rememberLazyListState()结合rememberCoroutineScope()实现返回顶部。

/**
 * 基础列表一
 */
@Composable
fun Items() {
    Box(modifier = Modifier.fillMaxSize()) {
        val context = LocalContext.current
        val dataList = arrayListOf<Int>()
        for (index in 1..50) {
            dataList.add(index)
        }

        val listState = rememberLazyListState()
        LazyColumn(state = listState) {
            items(dataList) { data ->
                Text(
                    text = "第${data}条数据",
                    textAlign = TextAlign.Center,
                    //属性设置先后顺序不一样运行效果会不一样
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(top = 1.dp)
                        .background(Color.White)
                        .clickable {
                            Toast
                                .makeText(context, "$data", Toast.LENGTH_SHORT)
                                .show()
                        }
                        .padding(10.dp)
                )
            }
        }

        //返回顶部
        val coroutineScope = rememberCoroutineScope()
        Image(
            modifier = Modifier
                .padding(end = 10.dp, bottom = 10.dp)
                .width(45.dp)
                .height(45.dp)
                .clip(CircleShape)
                .align(Alignment.BottomEnd)
                .background(Color.Blue)
                .clickable {
                    coroutineScope.launch {
                        listState.animateScrollToItem(index = 0)
                    }
                },
            painter = painterResource(id = R.drawable.top),
            contentDescription = "返回顶部图标"
        )
    }
}

基础列表二

LazyColumn中通过itemsIndexed属性加载数据。

/**
 * 基础列表二
 */
@Composable
fun ItemsIndexed() {
    val context = LocalContext.current
    val stringList = arrayListOf<String>()
    for (index in 1..50) {
        stringList.add(index.toString())
    }
    LazyColumn {
        //stringList.toArray()方法可以通过List的toArray方法将List转为Array
        itemsIndexed(stringList) { index, data ->
            Text(
                text = "我的下标是:${index},我的数据为:$data",
                textAlign = TextAlign.Center,
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(top = 1.dp)
                    .background(Color.White)
                    .clickable {
                        Toast
                            .makeText(context, data, Toast.LENGTH_SHORT)
                            .show()
                    }
            )
        }
    }
}

多Type列表

 根据不同数据类型加载不同布局。

/**
 * 多Type列表
 */
@Composable
fun AnyTypeList() {
    val charList = arrayListOf<Chat>()
    charList.apply {
        add(Chat("你好啊"))
        add(Chat("你在干啥呢"))
        add(Chat("想问你个事"))
        add(Chat("没干啥,还在写代码啊!", false))
        add(Chat("啥事啊大哥?", false))
        add(Chat("没事。。。"))
        add(Chat("好吧。。。", false))
    }

    LazyColumn {
        items(charList) { data ->
            if (data.isLeft) {
                Column(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(start = 10.dp)
                ) {
                    //间隔设置
                    Spacer(modifier = Modifier.height(10.dp))
                    Row(
                        verticalAlignment = Alignment.CenterVertically
                    ) {
                        Image(
                            modifier = Modifier
                                .width(35.dp)
                                .height(35.dp)
                                //裁剪圆形
                                .clip(CircleShape),
                            painter = painterResource(id = R.drawable.ic_launcher_background),
                            contentDescription = "左头像"
                        )
                        Spacer(modifier = Modifier.width(10.dp))
                        Text(
                            data.content,
                            modifier = Modifier
                                .wrapContentWidth()
                                .background(Color.Yellow)
                                .padding(10.dp),
                        )
                    }
                }
            } else {
                Column(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(end = 10.dp),
                    horizontalAlignment = Alignment.End
                ) {
                    Spacer(modifier = Modifier.height(10.dp))
                    Row(
                        verticalAlignment = Alignment.CenterVertically
                    ) {
                        Text(
                            data.content,
                            modifier = Modifier
                                .wrapContentWidth()
                                .background(Color.Green)
                                .padding(10.dp)
                        )
                        Spacer(modifier = Modifier.width(10.dp))
                        Image(
                            modifier = Modifier
                                .width(35.dp)
                                .height(35.dp)
                                .clip(CircleShape),
                            painter = painterResource(id = R.drawable.ic_launcher_background),
                            contentDescription = "右头像"
                        )
                    }
                }
            }
        }
    }
}

数据类:

/**
 * created by cwj on 2023-10-16
 * Description:多类型列表类
 */
data class Chat(val content: String, val isLeft: Boolean = true)

粘性标题列表

使用粘性标题stickyHeader组件。滑动列表,一级标题悬浮顶部,随着列表滑动顶部一级列表滑出被替换,顶部一直保持一项一级标题悬浮。

/**
 * 粘性标题列表
 */
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun StickyHeaderTest() {
    val context = LocalContext.current
    val letters = arrayListOf("类型一", "类型二", "类型三", "类型四", "类型五")
    val contactList = arrayListOf<Contact>()
    val nameList = arrayListOf<String>()
    for (index in 1..5) {
        nameList.add("子项$index")
    }
    for (index in letters.iterator()) {
        contactList.add(Contact(letters = index, nameList))
    }

    LazyColumn {
        contactList.forEach { (letter, nameList) ->
            stickyHeader {
                Text(
                    text = letter,
                    modifier = Modifier
                        .background(Color.LightGray)
                        .padding(start = 10.dp)
                        .fillMaxWidth(),
                    fontSize = 25.sp
                )
            }

            items(nameList) { contact ->
                Text(
                    text = contact,
                    modifier = Modifier
                        .padding(10.dp)
                        .background(Color.White)
                        .fillMaxWidth()
                        .clickable {
                            Toast
                                .makeText(context, contact, Toast.LENGTH_SHORT)
                                .show()
                        },
                    textAlign = TextAlign.Center,
                    fontSize = 25.sp
                )
            }
        }
    }
}

黏性标题和列表数据能对应起来的数据类:

/**
 * created by cwj on 2023-10-17
 * Description:黏性标题和列表数据能对应起来的数据类
 */
data class Contact(val letters: String, val nameList: List<String>)

完整代码:

import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.cwj.composedemo.ui.theme.ComposeDemoTheme
import kotlinx.coroutines.launch

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ComposeDemoTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Greeting()
                }
            }
        }
    }
}

@Composable
fun Greeting() {
//    Items()
//    ItemsIndexed()
//    AnyTypeList()
    StickyHeaderTest()
}

/**
 * 粘性标题列表
 */
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun StickyHeaderTest() {
    val context = LocalContext.current
    val letters = arrayListOf("类型一", "类型二", "类型三", "类型四", "类型五")
    val contactList = arrayListOf<Contact>()
    val nameList = arrayListOf<String>()
    for (index in 1..5) {
        nameList.add("子项$index")
    }
    for (index in letters.iterator()) {
        contactList.add(Contact(letters = index, nameList))
    }

    LazyColumn {
        contactList.forEach { (letter, nameList) ->
            stickyHeader {
                Text(
                    text = letter,
                    modifier = Modifier
                        .background(Color.LightGray)
                        .padding(start = 10.dp)
                        .fillMaxWidth(),
                    fontSize = 25.sp
                )
            }

            items(nameList) { contact ->
                Text(
                    text = contact,
                    modifier = Modifier
                        .padding(10.dp)
                        .background(Color.White)
                        .fillMaxWidth()
                        .clickable {
                            Toast
                                .makeText(context, contact, Toast.LENGTH_SHORT)
                                .show()
                        },
                    textAlign = TextAlign.Center,
                    fontSize = 25.sp
                )
            }
        }
    }
}

/**
 * 多Type列表
 */
@Composable
fun AnyTypeList() {
    val charList = arrayListOf<Chat>()
    charList.apply {
        add(Chat("你好啊"))
        add(Chat("你在干啥呢"))
        add(Chat("想问你个事"))
        add(Chat("没干啥,还在写代码啊!", false))
        add(Chat("啥事啊大哥?", false))
        add(Chat("没事。。。"))
        add(Chat("好吧。。。", false))
    }

    LazyColumn {
        items(charList) { data ->
            if (data.isLeft) {
                Column(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(start = 10.dp)
                ) {
                    //间隔设置
                    Spacer(modifier = Modifier.height(10.dp))
                    Row(
                        verticalAlignment = Alignment.CenterVertically
                    ) {
                        Image(
                            modifier = Modifier
                                .width(35.dp)
                                .height(35.dp)
                                //裁剪圆形
                                .clip(CircleShape),
                            painter = painterResource(id = R.drawable.ic_launcher_background),
                            contentDescription = "左头像"
                        )
                        Spacer(modifier = Modifier.width(10.dp))
                        Text(
                            data.content,
                            modifier = Modifier
                                .wrapContentWidth()
                                .background(Color.Yellow)
                                .padding(10.dp),
                        )
                    }
                }
            } else {
                Column(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(end = 10.dp),
                    horizontalAlignment = Alignment.End
                ) {
                    Spacer(modifier = Modifier.height(10.dp))
                    Row(
                        verticalAlignment = Alignment.CenterVertically
                    ) {
                        Text(
                            data.content,
                            modifier = Modifier
                                .wrapContentWidth()
                                .background(Color.Green)
                                .padding(10.dp)
                        )
                        Spacer(modifier = Modifier.width(10.dp))
                        Image(
                            modifier = Modifier
                                .width(35.dp)
                                .height(35.dp)
                                .clip(CircleShape),
                            painter = painterResource(id = R.drawable.ic_launcher_background),
                            contentDescription = "右头像"
                        )
                    }
                }
            }
        }
    }
}

/**
 * 基础列表二
 */
@Composable
fun ItemsIndexed() {
    val context = LocalContext.current
    val stringList = arrayListOf<String>()
    for (index in 1..50) {
        stringList.add(index.toString())
    }
    LazyColumn {
        //stringList.toArray()方法可以通过List的toArray方法将List转为Array
        itemsIndexed(stringList) { index, data ->
            Text(
                text = "我的下标是:${index},我的数据为:$data",
                textAlign = TextAlign.Center,
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(top = 1.dp)
                    .background(Color.White)
                    .clickable {
                        Toast
                            .makeText(context, data, Toast.LENGTH_SHORT)
                            .show()
                    }
            )
        }
    }
}

/**
 * 基础列表一
 */
@Composable
fun Items() {
    Box(modifier = Modifier.fillMaxSize()) {
        val context = LocalContext.current
        val dataList = arrayListOf<Int>()
        for (index in 1..50) {
            dataList.add(index)
        }

        val listState = rememberLazyListState()
        LazyColumn(state = listState) {
            items(dataList) { data ->
                Text(
                    text = "第${data}条数据",
                    textAlign = TextAlign.Center,
                    //属性设置先后顺序不一样运行效果会不一样
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(top = 1.dp)
                        .background(Color.White)
                        .clickable {
                            Toast
                                .makeText(context, "$data", Toast.LENGTH_SHORT)
                                .show()
                        }
                        .padding(10.dp)
                )
            }
        }

        //返回顶部
        val coroutineScope = rememberCoroutineScope()
        Image(
            modifier = Modifier
                .padding(end = 10.dp, bottom = 10.dp)
                .width(45.dp)
                .height(45.dp)
                .clip(CircleShape)
                .align(Alignment.BottomEnd)
                .background(Color.Blue)
                .clickable {
                    coroutineScope.launch {
                        listState.animateScrollToItem(index = 0)
                    }
                },
            painter = painterResource(id = R.drawable.top),
            contentDescription = "返回顶部图标"
        )
    }
}

@Preview(showBackground = true, showSystemUi = true)
@Composable
fun GreetingPreview() {
    ComposeDemoTheme {
        Greeting()
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1107668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

锐化多个视频的同时轻松快速批量添加上背景图片的教程

在日常生活中&#xff0c;我们可能经常需要给一些视频添加背景图。但是&#xff0c;这并不是一项简单的任务&#xff0c;需要花费大量的时间和精力。那么&#xff0c;有没有一种简单的方法可以批量添加背景图到视频呢&#xff1f;答案是肯定的。下面&#xff0c;我们就来介绍一…

【word技巧】word页眉,如何禁止他人修改?

我们设置了页眉内容之后&#xff0c;不想其他人修改自己的页眉内容&#xff0c;我们可以设置加密的&#xff0c;设置方法如下&#xff1a; 先将页眉设置好&#xff0c;退出页眉设置之后&#xff0c;我们选择布局功能&#xff0c;点击分隔符 – 连续 设置完之后页面分为上下两节…

css 好看的边框

1、把图片作为边框 border:10px solid transparent;border-image:url(./assets/images/login_bg.png) 30 round;2、斜线边框 斜线边框可以给页面元素增加一份生动感。可以使用linear-gradient()函数来设置。 .box{position:relative;border-top:4px solid #667db6;border-bot…

计算机基础知识34

进程锁 # 锁在IT界很重要&#xff0c;不但在Python中出现&#xff0c;尤其是数据库中得锁更多&#xff0c;比如&#xff1a;表锁、行锁、 悲观锁、乐观锁、进程锁、互斥锁、递归锁、可重入锁、死锁等 # 保证安全 import time # 导入time&#xff0c;执行顺序乱了 from…

docker 部署mysql

Centos7为例 NAME"CentOS Linux" VERSION"7 (Core)" ID"centos" ID_LIKE"rhel fedora" VERSION_ID"7" PRETTY_NAME"CentOS Linux 7 (Core)" ANSI_COLOR"0;31" CPE_NAME"cpe:/o:centos:centos:7&qu…

【ubuntu】常用软件安装

【ubuntu】常用软件安装 前言安装搜狗输入法安装flameshot截图软件总结 前言 Ubuntu 是一个基于 Linux 内核的开源操作系统&#xff0c;它提供了简单易用的界面和丰富的功能&#xff0c;广受开发者和普通用户的喜爱。博主时常也需要经常切换Ubuntu系统进行开发和学习&#xff…

联邦学习综述四

A Survey on Security and Privacy of Federated Learning 选自&#xff1a;Future Generation Computer Systems&#xff0c;2020 本文介绍了联邦学习安全以及隐私方面面临的挑战&#xff0c;提出了一些现有的解决方案。 引言 联邦学习(FL)提供了一种通过将数据从中心服务…

在外包干了4年,我跑路了...

前言 先说一下自己的情况&#xff0c;本人普通本科毕业&#xff0c;19年的时候入的这行&#xff0c;在外包干了4年多功能测试&#xff0c;今年感觉自己不能够在这样下去了&#xff08;虽然目前行业不太好&#xff09;&#xff0c;长时间呆在外包会让一个人慢慢废掉&#xff01…

IDEA如何拉取gitee项目?

1.登录gitee 说明&#xff1a;打开idea&#xff0c;在设置上面搜索框输入gitee&#xff0c;然后登录gitee注册的账号。 2. 创建gitee仓库 说明&#xff1a;创建idea中的gitee仓库。 3.寻找项目文件 说明&#xff1a;为需要添加gitee仓库的项目进行添加。 4.项目右键 说明&a…

一文带你GO语言入门

什么是go语言? Go语言(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go语言的主要特点包括:- 简洁和简单 - 语法简单明快,易于学习和使用 特点 高效 编译速度快,执行效率高 并发支持 原生支持并发,利用goroutine实现高效的并发…

Java OpenJDK 8u392 Windows x64

文章目录 &#xff08;一&#xff09;Azul&#xff08;二&#xff09;Adopt&#xff08;三&#xff09;IBM&#xff08;四&#xff09;Oracle &#xff08;一&#xff09;Azul WEB Page&#xff1a;&#x1f517;Download Azul Zulu Builds of OpenJDK Windows archive&#xf…

绝对详细的MyBatis代码生成器讲解

0.简介 在springboot工程中如果使用mybatis作为持久层框架&#xff0c;那必须知道如何自动生成 java 实体类、dao 层接口&#xff08;mapper 接口&#xff09;及mapper.xml文件&#xff0c;这样可以减少不必要的开发。 生成代码的方式有很多种&#xff0c;比如说利用idea的插…

rust学习—— 控制流if 表达式

控制流 根据条件是否为真来决定是否执行某些代码&#xff0c;或根据条件是否为真来重复运行一段代码&#xff0c;是大部分编程语言的基本组成部分。Rust 代码中最常见的用来控制执行流的结构是 if 表达式和循环。 if 表达式 if 表达式允许根据条件执行不同的代码分支。你提供…

C++学习:数据的存储、作用域、链接

一、数据的存储方式 C中使用3种不同的方案来存储数据&#xff0c;不同方案的区别在于数据在内存中保留的时间。 1、自动存储 在函数定义中声明的变量&#xff0c;以及函数的参数&#xff0c;是自动存储的。在程序执行对应函数的时候创建这些变量&#xff0c;对应的函数执行完…

别再卷组件库了,Vue 拖拽库都断代了!

前言 最近在测试 Tailwind CSS 和 Uno CSS 这两种原子化 CSS 工具是否能够有效减少打包后的文件体积时&#xff0c;先开始分析这些工具的优缺点&#xff0c;然后再直接上数据&#xff0c;最后做了一款经典的 TodoList 来进行测试&#xff0c;文章都写好了就差最后的数据了。 …

中国人民大学与加拿大女王大学金融硕士项目:开启你的金融精英之路

在全球化的今天&#xff0c;金融行业的发展日新月异&#xff0c;对金融人才的需求也日益增长。为了满足这一需求&#xff0c;中国人民大学与加拿大女王大学联合推出了金融硕士项目&#xff0c;旨在培养具有国际视野、专业素养和创新能力的金融精英。 这一开创性的项目将两大世…

VR全景图片如何拍摄制作,拍摄制作过程中要注意什么?

引言&#xff1a; VR全景图片就是通过专业的相机设备捕捉到的一个空间的高清图像&#xff0c;再经过专业工具进行拼合&#xff0c;呈现出一种环绕式的视觉效果。想象一下&#xff0c;当你站在一个完全真实的环境中&#xff0c;可以自由地转动视角&#xff0c;看到四周的景色&a…

2023.10(u盘刻录iso)主机,vmware,virtualbox安装linux/ubuntu/kali/centos stream9/arch

download 1 kali官网 2 ubuntu官网 3vmware workstation pro(最新版17pro) 4 virtualbox for linux sudo apt install virtualbox-ext-pack 5 win32 disk imger linux dd 刻录iso到u盘 #查看U盘路径 fdisk -l #图形界面 以kali为例会在桌面出现挂载图标 点开之后输入pwd寻…

基于svg+js实现简单动态时钟

实现思路 创建SVG容器&#xff1a;首先&#xff0c;创建一个SVG容器元素&#xff0c;用于容纳时钟的各个部分。指定SVG的宽度、高度以及命名空间。 <svg width"200" height"200" xmlns"http://www.w3.org/2000/svg"><!-- 在此添加时钟…

森海塞尔EW-DP SKP直插式发射机:真正的无失真录制

韦德马克&#xff0c;2023年9月15日 – 10月底&#xff0c;EW-DP系列将再添新品——EW-DP SKP直插式发射机&#xff0c;面向摄像师、广播电视公司和电影制作人。板载32位浮点录制&#xff0c;结合该系列领先的134 dB发射机动态范围&#xff0c;让音频失真不复存在。无论要在现场…