Jetpack Compose系列(3)-使用列表

使用列表

在 View 体系中,创建自定义布局必须扩展 ViewGroup 并实现测量和布局函数。在 Compose 中,只需使用 Layout 可组合项编写一个(布局)函数即可。上一篇文章我们详细介绍了Column()和Row()这两各横向布局,这里我们继续介绍其他布局。

在此之前,我们先使用 Column()创建一个包含 10 项的垂直列表,代码如下:

class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {SimpleList()}}
}@Composable
fun SimpleList(){Column{repeat(50){Text("Item #$it")}}
}

其对应效果如图:

image.gif
可见,repeat()是将{}中的内容重复()里的数值倍数。

这时候你会发现你怎么滚动屏幕也滑不出剩余的条目,这是因为默认情况下,Column()不会处理滚动操作,某些项是看不到的,因为它们在界面范围外。而要想让其可滚动可以添加verticalScroll修饰符来让Column()开启滚动。

@Composable
fun SimpleList(){// We save the scrolling position with this state that can also// be used to programmatically scroll the listval scrollState = rememberScrollState()	//保存滚动的位置信息Column(Modifier.verticalScroll(scrollState)) {repeat(50) {Text("Item #$it")}}
}

进一步说明,想让Column或者Row可以滚动,直接添加下面的属性就可以了:Modifier.verticalScroll(rememberScrollState())或者horizontalScroll(rememberScrollState())。

延迟列表

Column()会渲染所有列表项,甚至包括界面上看不到的项,当列表大小变大时,这会造成性能问题。为避免此问题,可以使用 LazyColumn,它只会渲染界面上的可见项,因而有助于提升性能,而且无需使用 scroll 修饰符。谷歌的官方网站上表示,Jetpack Compose 中的 LazyColumn 等同于 Android 视图中的 RecyclerView。俩者在使用上的确有很多相似之处。跟RecyclerView一样,LazyColumn 使用 items()用于描述其列表内容。这里,它会接受一个数字作为列表大小。它还支持数组和列表。基本语法与Column()几乎一致。

@Composable
fun SimpleList(){val scrollState = rememberLazyListState()LazyColumn(state = scrollState) {items(100) {Text("Item #$it")}}
}

在LazyColumn()中,基本的函数包括:item() 用于添加单个列表项,items(Int) 用于添加多个列表项。如下示例:

fun SimpleList(){val scrollState = rememberLazyListState()LazyColumn(state = scrollState) {// Add a single itemitem {Text(text = "First item")}// Add 5 itemsitems(5) { index ->Text(text = "Item: $index")}// Add another single itemitem {Text(text = "Last item")}}
}

对应的显示为:

image.gif
还有许多扩展函数可用于添加列表项的集合,较常用的例如 List:

@Composable
fun MessageList(messages: List<Message>) {LazyColumn {items(messages){ message ->//...}}
}

还可以使用itemsIndexed()扩展函数,该函数提供索引index(这个用在需要获取列表位置和示例的场景中就很香了):

LazyColumn() {itemsIndexed(viewModel.list) { index, item ->//..}
}

item 内边距

可以将一些 PaddingValues 传递给 contentPadding 参数来围绕内容边缘添加内边距,例如:

LazyColumn(contentPadding = PaddingValues(horizontal = 10.dp, vertical = 11.dp),) {// ...
}

这里将 16.dp 内边距添加到水平边缘(左侧和右侧),然后将 8.dp 内边距添加到内容的顶部和底部。需要注意,这里的内边距值得是针对item,而不是LazyColumn实例本身。

item间距

使用Arrangement.spacedBy()来添加列表项之间的间距,例如:

@Composable
fun SimpleList(){LazyColumn(verticalArrangement = Arrangement.spacedBy(4.dp)) {items(10){Text("item $it")}}
}

对应显示为:

image.gif
可以看出每个列表项之间添加了4dp的间距。

延迟横向列表

既然有纵向列表,当然也会有横向列表:LazyRow。就像Coloumn()和Row()的函数使用差别一样,LazyRow跟LazyColumn在使用上也类似。

当然,LazyColumn设置的竖向间距与之相对的在这是设置横向间距。对应属性如下:

@Composable
fun SimpleList(){LazyRow(horizontalArrangement = Arrangement.spacedBy(4.dp)) {items(10){Text("item $it")}}
}

对应效果自然就是横向间距每个条目相隔4dp:

image.gif
其余属性使用与LazyColumn一致,在这就不赘述。

Box

对比原生的View体系,你会发现:

Column 相当于纵向的LinearLayout;

Row 相当于横向的LinearLayout;

那么,有没有相对应的FrameLayout。

有的,Box布局就是。使用Box可将一个元素放在另一个元素上面,例如下面:

@Composable
fun SimpleList(){Box(Modifier.size(100.dp, 100.dp).background(Color.Black)) {}Box(Modifier.size(50.dp, 50.dp).background(Color.Red)) {}
}

对应生成的界面就是重叠在一块的:

image.gif
当然,Box也可以内嵌自身,上述代码也可改为:

@Composable
fun SimpleList(){Box(Modifier.size(100.dp, 100.dp).background(Color.Black)) {Box(Modifier.size(50.dp, 50.dp).background(Color.Red)) {}}
}

运行后屏幕显示效果一致。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++输出地址

下面是一段输出地址的程序。 #include <bits/stdc.h> using namespace std;int main() {int s;cout << &s;//原地址return 0; }假如有一个人&#xff08;的朋友&#xff09;后来了&#xff0c;他也想住进的房间&#xff0c;我们可以这样&#xff1a; #includ…

Python爬虫http基本原理

Python爬虫逆向系列&#xff08;更新中&#xff09;&#xff1a;http://t.csdnimg.cn/5gvI3 HTTP 基本原理 在本节中&#xff0c;我们会详细了解 HTTP 的基本原理&#xff0c;了解在浏览器中敲入 URL 到获取网页内容之间发生了什么。了解了这些内容&#xff0c;有助于我们进一…

阿里云智能集团副总裁安筱鹏:企业数字化的终局是什么?

以下文章来源于数字化企业 &#xff0c;作者安筱鹏博士 回答数字化终局追问的起点是&#xff0c;企业需要重新定义我是谁。成为有竞争力的行业领导厂商&#xff0c;你应当成为一个客户运营商&#xff0c;即能够实时洞察、实时满足客户需求&#xff0c;追求极致的客户体验。而要…

SPI指数计算(Standardized Precipitation Index,标准化降水指数) 附完整MATLAB代码

SPI指数(Standardized Precipitation Index,标准化降水指数)是反映干湿状况的一个指标,主要计算步骤如下: 收集研究区域过去30年或以上时间尺度(一般选取30年)的月降水量资料。 对月降水量资料进行统计分析,拟合出最适合的概率分布函数。常用的有Pearson III 分布、Gamma分布…

2024年美国大学生数学建模竞赛(美赛)C题代码

代码只写了核心部分、包括数据预处理和建模等&#xff0c;仅供参考 获取方法见文末&#xff0c;部分截图如下 免费获取代码 关注威信公众号 Python风控模型与数据分析&#xff0c;回复 24年美赛C题代码 文末查看如何免费获取代码&#xff1b;编写不易&#xff0c;辛苦多多关注…

【C++】类与对象(三)—运算符重载|const成员函数|取地址及const取地址操作符重载

前言 运算符重载&#xff0c;自增自减运算符重载&#xff0c;const成员函数&#xff0c;取地址及const取地址操作符重载 文章目录 一、运算符重载自增和自减运算符重载 二、const 成员函数三、取地址及const取地址操作符重载&#xff08;了解即可&#xff09; 一、运算符重载 运…

【微服务】skywalking自定义链路追踪与日志采集

目录 一、前言 二、自定义链路追踪简介 2.1 自定义链路追踪应用场景 2.2 链路追踪几个关键概念 三、skywalking 自定义链路追踪实现 3.1 环境准备 3.2 集成过程 3.2.1 导入核心依赖 3.2.2 几个常用注解 3.2.3 方法集成 3.2.4 上报追踪信息 四、skywalking 自定义日志…

一文讲完Jetpack常用修饰符

Jetpack Compose系列(4) - 修饰符 修饰符 Modifier&#xff0c;即JetpackCompose中的修饰符&#xff0c;可以用来修饰以下内容&#xff1a; 更改可组合项的大小、布局、行为和外观 添加信息&#xff0c;如无障碍标签 处理用户输入 添加高级互动&#xff0c;如使元素可…

2024年【低压电工】复审考试及低压电工作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 低压电工复审考试参考答案及低压电工考试试题解析是安全生产模拟考试一点通题库老师及低压电工操作证已考过的学员汇总&#xff0c;相对有效帮助低压电工作业考试题库学员顺利通过考试。 1、【单选题】()是保证电气作…

第二十四天| 77. 组合

Leetcode 77. 组合 题目链接&#xff1a;77 组合 题干&#xff1a;给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 思考&#xff1a;回溯法。把回溯法的搜索过程抽象为树形结构。 每次从集合中选取元素&#xff0…

【开源】基于JAVA+Vue+SpringBoot的河南软件客服系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、系统展示四、核心代码4.1 查询客户4.2 新增客户跟进情况4.3 查询客户历史4.4 新增服务派单4.5 新增客户服务费 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的河…

【Python小游戏】五子棋小游戏(完整代码)

文章目录 写在前面Tkinter简介五子棋小游戏游戏介绍程序设计运行结果注意事项写在后面写在前面 本期内容:基于tkinter开发一个五子棋小游戏 实验环境 python3.11及以上pycharmtkinterTkinter简介 Tkinter是Python中最常用的图形用户界面(GUI)库之一,用于创建窗口、对话框…