Jetpack compose学习笔记之列表(布局)
一,简介
Jetpack compose中的布局主要分为Column,Row,Box。
二,Column创建的列表
Column创建list时,不管内容是在屏幕内还是屏幕外,都会将list的内容全部创建。当list内容很多时,性能不好。
@Composable
fun SimpleList() {
// 记录滑动的位置
val scrollState = rememberScrollState() // Column默认情况下只能显示屏幕内的内容
// 如果未设置Modifier.verticalScroll(scrollState),list则不能滑动
Column(Modifier.verticalScroll(scrollState)) {
repeat(100) {
Text("Item #$it")
}
}
}
三,Lazy list
LazyColumn只会生成屏幕内的内容,相比于Column性能好,也不需要设置scroll modifier。
LazyColumn相当于Android中的RecyclerView。
@Composable
fun LazyList() {
// 记录滑动状态
val scrollState = rememberLazyListState() LazyColumn(state = scrollState) {
items(100) {
Text("Item #$it")
}
}
}
四,利用LazyColumn创建一个list
效果
1. 创建list item
因为list item的图片来自网络,所以先添加coil库来简化获取图片的流程
// build.gradle
implementation 'io.coil-kt:coil-compose:1.3.0'
添加网络权限
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET" />
创建item
@Composable
// Modifier可以装饰Composable,包括行为(如clickable),外观(如padding)以及信息等
// 设置可选的modifier可以使方法更灵活,Modifier为默认值,什么也不会做
fun PhotographerCard(index: Int, modifier: Modifier = Modifier) {
Row(
modifier
// 相当于match_parent,否则效果为wrap_content
.fillMaxWidth()
.padding(8.dp)
.clip(RoundedCornerShape(4.dp))
.background(MaterialTheme.colors.surface)
// clickable和padding的顺序不同,意义会不一样
// 先clickable再padding,click的范围是包括padding的,反之则不包括
.clickable(onClick = {})
.padding(16.dp)) {
// 设置图片的占位符(placeholder),图片加载完成后也不会消失
Surface(
modifier = Modifier.size(50.dp),
shape = CircleShape,
color = MaterialTheme.colors.onSurface.copy(alpha = 0.2f)
) {
Image(
painter = rememberImagePainter(
data = "https://developer.android.google.cn/images/brand/Android_Robot.png"
),
contentDescription = "LOGO",
modifier = Modifier.size(50.dp)
)
}
Column(
modifier = Modifier
// 设置图片和文字直接的间距
.padding(start = 8.dp)
// 文字内容垂直居中
.align(Alignment.CenterVertically)
) {
Text("Android #$index", fontWeight = FontWeight.Bold)
// LocalContentAlpha定义孩子View的透明度
CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
Text("kotlin", style = MaterialTheme.typography.body2)
}
}
}
}
2. 用list item创建列表
@Composable
fun ScrollingList() {
val listSize = 100
val scrollState = rememberLazyListState() LazyColumn(state = scrollState) {
items(listSize) {
// 将item index传递,0-99
PhotographerCard(it)
}
}
}
3. 创建Button
@Composable
fun ScrollingList() {
val listSize = 100
val scrollState = rememberLazyListState()
// 为了在滑动过程中不影响list的描绘,animateScrollToItem方法被设计为suspend方法,所以需要在协程中执行
val coroutineScope = rememberCoroutineScope() Column {
Row {
Button(onClick = {
coroutineScope.launch {
// 跳转到list的第一项
scrollState.animateScrollToItem(0)
}
}) {
Text("回到顶部")
} Button(onClick = {
coroutineScope.launch {
// 跳转到list的最后一项
scrollState.animateScrollToItem(listSize - 1)
}
}) {
Text("回到底部")
}
}
LazyColumn(state = scrollState) {
items(listSize) {
PhotographerCard(it)
}
}
}
}
更多内容请查询:
Layouts in Jetpack Compose (google.cn)
Jetpack compose学习笔记之列表(布局)的更多相关文章
- Jetpack Compose学习(5)——从登录页美化开始学习布局组件使用
原文:Jetpack Compose学习(5)--从登录页美化开始学习布局组件使用 | Stars-One的杂货小窝 本篇主要讲解常用的布局,会与原生Android的布局控件进行对比说明,请确保了解A ...
- Jetpack Compose学习(9)——Compose中的列表控件(LazyRow和LazyColumn)
原文:Jetpack Compose学习(9)--Compose中的列表控件(LazyRow和LazyColumn) - Stars-One的杂货小窝 经过前面的学习,大致上已掌握了compose的基 ...
- Jetpack Compose学习(6)——关于Modifier的妙用
原文: Jetpack Compose学习(6)--关于Modifier的妙用 | Stars-One的杂货小窝 之前学习记录中也是陆陆续续地将常用的Modifier的方法穿插进去了,本期就来详细的讲 ...
- Jetpack Compose学习(7)——MD样式架构组件Scaffold及导航底部菜单
Jetpack Compose学习(7)--MD样式架构组件Scaffold及导航底部菜单 | Stars-One的杂货小窝 Compose给我们提供了一个Material Design样式的首页组件 ...
- 微信小程序开发:学习笔记[4]——样式布局
微信小程序开发:学习笔记[4]——样式布局 Flex布局 新的布局方式 在小程序开发中,我们需要考虑各种尺寸终端设备上的适配.在传统网页开发,我们用的是盒模型,通过display:inline | b ...
- amazeui学习笔记--css(布局相关3)--辅助类Utility
amazeui学习笔记--css(布局相关3)--辅助类Utility 一.总结 1.元素清除浮动: 添加 am-cf 这个 class 即可 2.水平滚动: .am-scrollable-horiz ...
- Jetpack Compose学习(1)——从登录页开始入门
原文地址:Jetpack Compose学习(1)--从登录页开始入门 | Stars-One的杂货小窝 Jetpack Compose UI在前几天出了1.0正式版,之前一直还在观望,终于是出了正式 ...
- Jetpack Compose学习(2)——文本(Text)的使用
原文: Jetpack Compose学习(2)--文本(Text)的使用 | Stars-One的杂货小窝 对于开发来说,文字最为基础的组件,我们先从这两个使用开始吧 本篇涉及到Kotlin和DSL ...
- Jetpack Compose学习(3)——图标(Icon) 按钮(Button) 输入框(TextField) 的使用
原文地址: Jetpack Compose学习(3)--图标(Icon) 按钮(Button) 输入框(TextField) 的使用 | Stars-One的杂货小窝 本篇分别对常用的组件:图标(Ic ...
- python学习笔记整理——列表
Python 文档学习笔记 数据结构--列表 列表的方法 添加 list.append(x) 添加元素 添加一个元素到列表的末尾:相当于a[len(a):] = [x] list.extend(L) ...
随机推荐
- ES实战-trying to create too many buckets
场景 es查询报错,报错如下: trying to create too many buckets. must be less than or equal to: [10000] but was [1 ...
- (0709) Linux-命令(scp,tar) zip
(1) scp .bashrc root@192.168.1.6:vnc://cfy-hp-notebook-pc.local (2) tar -czvf a.tar.gz b ...
- Error occurred while proxying request localhost:端口 报错500的解决方法
'/AuthServer/api/': { target: 'https://localhost:44319', secure:false,// 这是签名认证,http和https区分的参数设置 ch ...
- java annotation(如何创建新的注解)小结
"注解"有三种 1:无实际参数,只有声明 2:只存在单一参数,有些像方法调用 3:有多个参数 标准的"注解"就先不总结了. 想总结一下<如何创建自己的注解 ...
- .Net的产品变迁
从开始接触.Net以来,转眼过了好几年.在这许多年里,不得不感慨.Net产品线也在不断发生着变化, 下面就简单的进行一下梳理. .Net能做桌面应用程序,也就是C/S,也能做网站开发,就是通常说的B/ ...
- JS字符串拼接的方法及性能比较
一.+和+=str += "one" + "two";这段代码在运行过程中,会经历四个步骤:1.在内存中创建一个临时字符串2.将连接后的字符串"one ...
- 如何从相机拍照建立的Fileprovider中获取绝对路径
我们通过高版本获取的fileprovider,然后拍了个照片,如下 imageUri = FileProvider.getUriForFile 但是我们发现当我们 File file = new Fi ...
- chklist
1. 重复检查的必要性.一段代码如果在测试期间没问题,也要间隔几天再去观察是否有问题.2. 如果是集群式的服务,使用定时任务要采用分布式锁,或使用工具随机发送一台都可以.3. 如果任务跑失败,需要支持 ...
- Quartus II 17.1新建一个流水灯
诸图排序:从左到右,从上到下 一.软件设置 1.新建工程并添加FPGA芯片 2.新建.v文件并添加至顶层实体 3.元器件特性设置 4.分析与阐述(生成网表文件) 5.引脚分配 6.编译(包含分析与综合 ...
- 全国分乡镇第六次人口普查数据shp数据库省市区县街道
全国分乡镇第六次人口普查数据shp数据库省市区县街道 ==名称:全国第六次人口普查任意十个乡镇的乡镇界地图==数据说明:精确到乡镇级别.==数据:面数据,属性列表(乡镇名.乡镇代码,第六次人口普查分乡 ...