当前位置: 首页 > news >正文

Android-Compose 列表组件详解

目录

一,前言

二,LazyColumn和LazyRow的使用

2.1 coil

2.2 viewmodel

2.3 LazyColumn使用

2.4 LazyRow使用

2.5 LazyVerticalGrid使用

2.6 LazyHorizontalGrid

三,添加外边距

四,添加间隙

五,自定义宽度span

六,粘性标题


一,前言

在传统android中我们使用的列表组件是RecyclerView,但是在Compose中是没有RecyclerView组件的,它把列表组件分为了四个:LazyColumn,LazyRow,LazyVerticalGrid,LazyHorizontalGrid。从名称可以看出,LazyColumn 和 LazyRow 之间的区别就在于它们的列表项布局和滚动方向不同。LazyColumn 生成的是垂直滚动列表,而 LazyRow 生成的是水平滚动列表。LazyVerticalGrid 和 LazyHorizontalGrid 可组合项为在网格中显示列表项提供支持。延迟垂直网格会在可垂直滚动容器中跨多个列显示其列表项,而延迟水平网格则会在水平轴上有相同的行为。

二,LazyColumn和LazyRow的使用

2.1 coil

在compose中加载图片一般使用的是coil,下面我们介绍下coil是如何使用的:

首先在app的build.gradle中添加依赖:

implementation 'io.coil-kt:coil-compose:2.0.0-rc03'

在activity中加载网络图片:

class MainActivityNew : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {AsyncImage(model = "https://img2.baidu.com/it/u=1025320646,221016220&fm=253&app=138&f=JPEG?w=800&h=1421","", contentScale = ContentScale.Fit)}}
}

运行效果图:

2.2 viewmodel

viewmodel在compose中的使用与kotlin中有所不同,下面讲一下使用:

首先添加依赖:

implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0"

然后创建viewmodel:

class MyViewModel :ViewModel() {var chats by mutableStateOf(listOf(Student("伽罗","20","https://img2.baidu.com/it/u=1025320646,221016220&fm=253&app=138&f=JPEG?w=800&h=1421"),Student("妲己","22","https://pic.rmb.bdstatic.com/bjh/240119/081fe6fa14028b1831aa89f81a8b81191308.jpeg"),Student("李白","25","https://img1.baidu.com/it/u=986348615,2122549478&fm=253&app=138&f=JPEG?w=800&h=1423")))

在activity中使用:

class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {MyComposeTheme {Column (){var viewModel : MyViewModel =viewModel()AsyncImage(model = viewModel.chats.get(1).image, contentDescription = "")}}}}
}

运行效果:

2.3 LazyColumn使用

1.创建viewmodel:

class ListViewModel :ViewModel() {var student by mutableStateOf(listOf(Student("伽罗","20","https://img2.baidu.com/it/u=1025320646,221016220&fm=253&app=138&f=JPEG?w=800&h=1421"),Student("妲己","22","https://pic.rmb.bdstatic.com/bjh/240119/081fe6fa14028b1831aa89f81a8b81191308.jpeg"),Student("李白","25","https://img1.baidu.com/it/u=986348615,2122549478&fm=253&app=138&f=JPEG?w=800&h=1423")))
}
data class Student(var name:String,var age:String,var image:String)

2.使用:

class ListDemoActivity: ComponentActivity()  {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {var viewModel : ListViewModel = viewModel()LazyColumn(){items(viewModel.student){Column {Text(text = it.name)Text(text = it.age)AsyncImage(model = it.image,"", modifier = Modifier.width(100.dp).height(300.dp), contentScale = ContentScale.Fit)}}}}}
}

3.运行如下:

2.4 LazyRow使用

在activity中使用:

class ListDemoActivity: ComponentActivity()  {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {var viewModel : ListViewModel = viewModel()LazyRow(){items(viewModel.student){Column {Text(text = it.name)Text(text = it.age)AsyncImage(model = it.image,"", modifier = Modifier.width(100.dp).height(300.dp), contentScale = ContentScale.Fit)}}}}}
}

运行效果如下:

2.5 LazyVerticalGrid使用

在activity中使用:

class ListDemoActivity: ComponentActivity()  {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {var viewModel : ListViewModel = viewModel()LazyVerticalGrid(columns = GridCells.Fixed(2), //固定两列content = {items(viewModel.student){Column {Text(text = it.name)Text(text = it.age)AsyncImage(model = it.image,"", modifier = Modifier.width(100.dp).height(300.dp), contentScale = ContentScale.Fit)}}})}}
}

自适应大小宽度:

class ListDemoActivity: ComponentActivity()  {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {var viewModel : ListViewModel = viewModel()LazyVerticalGrid(columns = GridCells.Adaptive(100.dp),//自适应宽度){items(viewModel.student){Column(Modifier.background(it.color)) {Text(text = it.name)Text(text = it.age)AsyncImage(model = it.image,"", modifier = Modifier.width(100.dp).height(300.dp), contentScale = ContentScale.Fit)}}}}}
}

2.6 LazyHorizontalGrid

在activity中使用:

class ListDemoActivity: ComponentActivity()  {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {var viewModel : ListViewModel = viewModel()LazyHorizontalGrid(rows = GridCells.Fixed(2), //固定两行content = {items(viewModel.student){Column {Text(text = it.name)Text(text = it.age)AsyncImage(model = it.image,"", modifier = Modifier.width(100.dp).height(300.dp), contentScale = ContentScale.Fit)}}})}}
}

三,添加外边距

可以使用contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp)给组件整体设置外边距:

class ListDemoActivity: ComponentActivity()  {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {var viewModel : ListViewModel = viewModel()LazyVerticalGrid(contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp), columns = GridCells.Fixed(2)){items(viewModel.student){Column(Modifier.background(it.color)) {Text(text = it.name)Text(text = it.age)AsyncImage(model = it.image,"", modifier = Modifier.width(100.dp).height(300.dp), contentScale = ContentScale.Fit)}}}}}
}

效果如下:

四,添加间隙

要为子元素之间添加空隙也很简单,指定一下arrangemntspacedBy即可

horizontalArrangement = Arrangement.spacedBy(12.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
class ListDemoActivity: ComponentActivity()  {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {var viewModel : ListViewModel = viewModel()LazyVerticalGrid(columns = GridCells.Fixed(2),//固定两列verticalArrangement = Arrangement.spacedBy(10.dp),//垂直间隙horizontalArrangement = Arrangement.spacedBy(10.dp) //水平间隙){items(viewModel.student){Column(Modifier.background(it.color)) {Text(text = it.name)Text(text = it.age)AsyncImage(model = it.image,"", modifier = Modifier.width(100.dp).height(300.dp), contentScale = ContentScale.Fit)}}}}}
}

显示效果如下:

五,自定义宽度span

如果想让某一元素占满一行,可以使用span来实现,代码如下:

class ListDemoActivity: ComponentActivity()  {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {var viewModel : ListViewModel = viewModel()LazyVerticalGrid(columns = GridCells.Adaptive(100.dp),//自适应宽度verticalArrangement = Arrangement.spacedBy(10.dp),//垂直间隙horizontalArrangement = Arrangement.spacedBy(10.dp) //水平间隙){item(span = {// 占据最大宽度GridItemSpan(maxLineSpan)}){Column(Modifier.background(viewModel.one.color)) {Text(text = viewModel.one.name)Text(text = viewModel.one.age)AsyncImage(model = viewModel.one.image,"", modifier = Modifier.width(100.dp).height(300.dp), contentScale = ContentScale.Fit)}}items(viewModel.student){Column(Modifier.background(it.color)) {Text(text = it.name)Text(text = it.age)AsyncImage(model = it.image,"", modifier = Modifier.width(100.dp).height(300.dp), contentScale = ContentScale.Fit)}}}}}
}

效果如下:

六,粘性标题

使用stickyHeader可以实现粘性标题,实现代码如下:

class ListDemoActivity: ComponentActivity()  {@OptIn(ExperimentalFoundationApi::class)override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {var viewModel : ListViewModel = viewModel()LazyColumn(){stickyHeader {Row(Modifier.background(Color.Gray).width(100.dp).height(50.dp)){Text(text = "标题1")}}items(viewModel.student){Column {Text(text = it.name)Text(text = it.age)AsyncImage(model = it.image,"", modifier = Modifier.width(100.dp).height(300.dp), contentScale = ContentScale.Fit)}}stickyHeader {Row(Modifier.background(Color.Gray).width(100.dp).height(50.dp)){Text(text = "标题2")}}items(viewModel.student){Column {Text(text = it.name)Text(text = it.age)AsyncImage(model = it.image,"", modifier = Modifier.width(100.dp).height(300.dp), contentScale = ContentScale.Fit)}}}}}
}

运行效果如下:

http://www.dtcms.com/a/508505.html

相关文章:

  • 基于MATLAB的标准化降水蒸散指数(SPEI)实现
  • 网站建设与推广推荐做关于车的网站好
  • 【NestJS】中间件与管道:请求处理双雄对决
  • 网站设计做微信发现界面济宁500元做网站
  • 赣州网站制作深圳网站建设 设计创公司
  • 网站后台管理系统怎么上传wordpress计费查询
  • Easyexcel 结合POI 做图片读取
  • 聚美联盟网站怎么做中国建设积分商城网站
  • 基于.NET UA Client SDK构建跨平台OPC UA客户端应用
  • Transformer神经网络模型
  • 深入理解 Linux 负载平均值:由浅入深
  • 网站排版设计欣赏适合学生做的微商代理
  • 【穿越Effective C++】条款01:视C++为一个语言联邦
  • Linux系统编程:(四)基础指令详解(3)
  • 彻底清除Windows程序卸载后的注册表与功能列表残留
  • 【学习系列】SAP RAP 12:行为定义-Side Effects
  • 虚拟机的网卡netplan
  • 用C语言实现适配器模式
  • java求职学习day43
  • 做路牌的网站有哪些做调查的网站可以赚钱
  • 中原郑州网站建设iframe wordpress
  • h5游戏免费下载:功夫猫
  • 大模型-LORA模型详解
  • admin二维码字符过长导致显示失败问题
  • 监控主要的噪音有哪些,怎么系统的降噪?怎么设置告警规则更合理化
  • 温州企业建站系统模板工程招标信息网
  • 代刷网站是怎么做的保定公司做网站
  • vs2017 如何做网站注册一个软件需要多少钱
  • php网站开发做什么图标不显示wordpress
  • 200道高频Java 面试题汇总(含答案解析)