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 list
    val 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 item
        item {
            Text(text = "First item")
        }
        // Add 5 items
        items(5) { index ->
            Text(text = "Item: $index")
        }
        // Add another single item
        item {
            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)
        ) {

        }
    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode:42. 接雨水

42. 接雨水 1&#xff09;题目2&#xff09;思路3&#xff09;代码4&#xff09;结果 1&#xff09;题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height …

Jmeter学习系列之四:测试计划元素介绍

测试计划元素 JMeter包含各种相互关联但为不同目的而设计的元素。在开始使用JMeter之前&#xff0c;最好先了解一下JMeter的一些主要元素。 注意:测试计划包含至少一个线程组。 以下是JMeter的一些主要组件: 测试计划&#xff08;Plan&#xff09;线程组(Thread Group)控制器…

每日OJ题_算法_模拟③_力扣6. Z 字形变换

目录 力扣6. Z 字形变换 解析代码 力扣6. Z 字形变换 6. Z 字形变换 难度 中等 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff…

C# 读取文件中的配置信息

文章目录 定义使用文件格式代码 C#读取文件并处理&#xff1b;C# 读取文件中的配置信息。 在有的程序中&#xff0c;需要从本地文件中读取配置信息&#xff0c;以进行初始化。 定义 定义一个静态函数来获取文件信息。StreamReader 类。 /// <summary> /// 读取参数文件…

【Linux Day14 UDP网络通讯】

UDP网络通讯 UDP报文结构&#xff1a; 16位源端口&#xff1a;用于记录发送端的端口号&#xff08;占用两个字节&#xff09;16位目的端口&#xff1a;用于记录接收端的端口号&#xff08;占用两个字节&#xff09;16位UDP长度&#xff1a;确定UDP报文总长度&#xff0c;&…

React18构建Vite+Electron项目以及打包

一.先创建项目 cnpm create vite 选择React > JavaScript >cd react_vite > cnpm i >npm run dev 二.安装Electron依赖 指定版本相对稳定 cnpm i electron19.0.10 -D cnpm i vite-plugin-electron0.9.3 -D cnpm i electron-builder23.0.1 -D三.创建electron目录…

算法:阿里巴巴找黄金宝箱(II)

一、算法描述 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0-N的箱子&#xff0c; 每个箱子上面贴有箱子中藏有金币Q的数量。 从金币数量中选出一个数字集合&#xff0c; 并销毁贴有这些数字的每个箱子&…

242. Valid Anagram(有效的字母异位词)

问题描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 问题分析 此问题与383. Ransom Note(赎金信)类似&#xff0c;只是字符变为了…

绝世唐门:霍挂六个十万年魂环,一穿七灭团再现,淘汰赛顺利晋级

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《斗罗大陆2绝世唐门》第32期超前爆料&#xff0c;霍雨浩开局便释放六个十万年魂环&#xff0c;以绝对的气场碾压天灵学院代表队。首次参与高级魂师大赛&#xff0c;霍雨浩便大放异彩秀出超级霍挂&#xff0c;此等操作就连当初的唐…

【Linux】wait()和waitpid()函数

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;Linux系列专栏&#xff1a;Linux基础 &#x1f525; 给大家…

Acwing第 141 场周赛

A题 签到模拟即可 B题 单独考虑每一个a[i]&#xff0c;如果i要是答案需要指针移动多少次&#xff0c;然后算完&#xff0c;排个序&#xff0c;指针移动最少的就是答案。 #include <bits/stdc.h> #define int long long #define rep(i,a,b) for(int i (a); i < (…

利用VPN设备漏洞入侵!新型勒索软件CACTUS攻击手法分析

近期&#xff0c;亚信安全应急响应中心截获了利用VPN设备已知漏洞传播的新型勒索软件CACTUS&#xff0c;该勒索于2023年3月首次被发现&#xff0c;一直保持着活跃状态。CACTUS勒索软件通过Fortinet VPN的已知漏洞进行入侵&#xff08;黑客首先获取到VPN账号&#xff0c;再通过V…

Javascript第四个知识点:严格检查模式

在javascript首行写上"use strict" 具体作用表现在哪儿呢&#xff1f; 他让我们的代码变得更加规范 不添加"use strict"可以不用var声明变量&#xff0c;但是会在一些时候与其他地方的 i 起冲突 添加了"use strict"之后就必须用var声明变量…

滑动窗口最终弹

力扣30.串联所有单词的子串&#xff08;巨困难&#xff09; 这个最难的是什么 1.代码的编写 2.容器的使用 class Solution {List<Integer>retnew LinkedList<>();//保存字典中所有单词的频次public List<Integer> findSubstring(String s, String[] words) …

Java动态代理与静态代理

代理模式 在Java中有多达23种的设计模式&#xff08;后面Java基础更新完后&#xff0c;会找个时间详细的去写写这些设计模式&#xff09;&#xff0c;恰当的设计模式的使用能够提升代码的效率&#xff0c;简化代码的复杂性。 而今天我们要说的代理模式就是其中之一&#xff0…

车载以太网:PHY(物理层)介绍

0 工具准备 TJA1101B芯片手册 TJA1101B automotive Ethernet PHY手册 IEEE802.3-2018.pdf 1 车载以太网PHY&#xff08;物理层&#xff09;介绍 常见的普通以太网分为10BASE-2、10/100BASE-TX和1000BASE-T&#xff0c;一般都使用RJ45接口&#xff0c;对于1000BASE-T来说&#…

数据结构中的时间复杂度和空间复杂度基础

目录 数据结构 数据结构中的基本名词 数据 数据对象 数据元素 数据项 数据类型 数据对象、数据元素和数据项之间的关系 数据结构及分类 逻辑结构 物理结构 算法 算法的特点 算法设计上的要求 算法效率的衡量 时间复杂度 大O渐进表示法 最坏情况和平均情况 常…

数字化转型:企业适应新常态的关键之举_光点科技

在全球商业环境不断演变和技术日新月异的背景下&#xff0c;数字化转型已经成为企业不可回避的课题。它不仅关乎企业的未来生存与发展&#xff0c;更是适应新常态、提升竞争力的关键之举。但是&#xff0c;数字化转型并非一夜之间可以完成的任务&#xff0c;它需要全面的策略规…

面试数据结构与算法总结分类+leetcode题目目录【基础版】

&#x1f9e1;&#x1f9e1;&#x1f9e1;算法题目总结&#xff1a; 这里为大家总结数据结构与算法的题库目录&#xff0c;如果已经解释过的题目会标注链接更新&#xff0c;方便查看。 数据结构概览 Array & String 大家对这两类肯定比较清楚的&#xff0c;同时这也是面试…

2024022期传足14场胜负前瞻

2024022期赛事由英超4场&#xff0c;德甲2场、意甲4场、西甲4场组成。售止时间为2月4日&#xff08;周日&#xff09;19点00分&#xff0c;敬请留意&#xff1a; 本期中深盘较多&#xff0c;1.5以下赔率3场&#xff0c;1.5-2.0赔率7场&#xff0c;其他场次是平半盘、平盘。本期…