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) ...
随机推荐
- 剑指 Offer II 树
我为什么要把代码粘在这里 断更很久了,基于一个错误的观念:我想看题,我到leetcode官网看不就行了吗? 但是若干年后我可能还会到我的博客园看看呀,我有可能上刷题网站吗?而且心得不好写到注释上. 记 ...
- 哲讯分享:sap软件多少钱一套
SAP软件一般指SAP. SAP,为"System Applications and Products"的简称,是德国SAP公司的产品--企业管理解决方案的软件名称.至今世界500 ...
- 解决sqlplus中方向键和退格键乱码问题
centos7 1.安装rlwrap软件包 yum install rlwrap -y 2.编辑环境变量 su - oracle vim ~/.bash_profile alias sqlplus=' ...
- UI基础 - UIAppearance协议
前言 1 - 在一些 app 中会涉及到更改外观设置的功能,最普遍的就是夜间模式和白天模式的切换,而对于外观的更改必定是一个全局的东西.这在 iOS5 以前想要实现这样的效果是比较困难的,但是 iOS ...
- Unity 关于可寻址资源系统Addressables的使用和理解(一) 准备工作
一.打开Unity的PackageManager,安装Addressables包 二.打开分组面板,对未来要分类的资源包进行分组,并对组进行设置. 1.菜单栏选择Window/AssetManagen ...
- windows 10 使用Ghost 恢复系统,安装bcd修复引导
使用windows10安装盘启动,进入系统修复选项,使用cmd X:Source\,那说明进入了管理者模式,然后按照以下步骤依次输入: 1.diskpart 2.sel disk 03.list pa ...
- pycharm永久激活码(亲测好用)
引用自某不知名大佬,在此致谢,获取激活码链接如下: https://www.ajihuo.com/pycharm/4197.html
- leetcode-152乘积最大子数组(两个转移方程的正确性证明)
1.dp数组的含义 maxDP[i]中存储 以nums[i]为结尾元素的子数组的最大乘积minDP[i]中存储 以nums[i]为结尾元素的子数组的最小乘积 注意到:maxDP[i] >= mi ...
- jquery获取单选按钮选中的值
jQuery 取选中的radio的值方法 var val=$('input:radio[name="sex"]:checked').val(); 附三种方法都可以: $('inpu ...
- 在LUbuntu上搭建Neovim+Markdown环境
前言 想搭建自己的电子笔记系统.一开始用VMware+Ubuntu,后来想,如果这个虚拟机文件比较小,就可以用克隆到U盘里,随身带了. 于是转Lubuntu. 总体步骤 安装系统 安装neovim 安 ...