【Android】【Compose】实现列表数据添加

devtools/2024/9/20 4:46:09/ 标签: android
序言

在使用列表的时候,以前是使用 Layout 布局里面添加Recyclerview进行列表的显示,但是在Compose里面,是没有这个Recyclerview使用的,那Compose怎么实现列表数据呢?

使用 【LazyColumn】

首先创建一个Compose项目

在创建Compose项目的时候,有时候会创建失败,因为使用的各种配置文件和Android studio版本可能导致的不兼容问题,出现各种意外情况。

我使用的Android studio版本是
在这里插入图片描述
在创建项目之后,配置文件如下,这样是可以正常运行的,用来学习Compose的使用方式是足够了。

setting.gradle

dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()jcenter() // Warning: this repository is going to shut down soon}
}
rootProject.name = "MyCompose"
include ':app'

项目下的gradle文件

buildscript {ext {compose_version = '1.0.1'}repositories {google()mavenCentral()}dependencies {classpath "com.android.tools.build:gradle:4.2.2"classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21'}
}task clean(type: Delete) {delete rootProject.buildDir
}

app下面的gradle文件

plugins {id 'com.android.application'id 'kotlin-android'
}android {compileSdk 30defaultConfig {applicationId "com.example.mycompose"minSdk 23targetSdk 30versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"vectorDrawables {useSupportLibrary true}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}kotlinOptions {jvmTarget = '1.8'useIR = true}buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion compose_versionkotlinCompilerVersion '1.5.21'}packagingOptions {resources {excludes += '/META-INF/{AL2.0,LGPL2.1}'}}
}dependencies {implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'androidx.core:core-ktx:1.3.2'implementation 'com.google.android.material:material:1.3.0'implementation 'androidx.constraintlayout:constraintlayout:2.0.4'implementation "androidx.compose.ui:ui:$compose_version"implementation "androidx.compose.material:material:$compose_version"implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'implementation 'androidx.activity:activity-compose:1.3.0-alpha06'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
}

gradle目录下的 wrapper文件夹下面的 gradle-wrapper.properties文件

distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

里面的版本不高,但是挺适合相应的Android studio版本的

在使用Recyclerview进行列表加载的时候,是需要创建一个数据bean的,在使用Compose的时候也不例外

创建一个数据Bean

data class Item(val id: Int, val name: String)

项目运行截图
在这里插入图片描述
项目运行代码

class ListActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {MyComposeTheme {Surface(modifier = Modifier.fillMaxSize(),color = Color.Green) {DynamicItemsList()}}}}
}@Composable
fun DynamicItemsList() {val items by remember { mutableStateOf(mutableStateListOf<Item>()) }fun addItem() {val newItem = Item(id = items.size + 1, name = "Item ${items.size + 1}")items.add(newItem)}Column(Modifier.fillMaxSize().padding(16.dp)) {Button(onClick = { addItem() }, modifier = Modifier.fillMaxWidth()) {Text(text = "ADD Item")}Spacer(modifier = Modifier.height(10.dp))LazyColumn(modifier = Modifier.fillMaxWidth().background(Color.White)) {items(items) { item ->ItemView(item = item)}}}
}@Composable
fun ItemView(item: Item) {Box(modifier = Modifier.fillMaxWidth().padding(8.dp).background(Color.LightGray).border(2.dp, color = Color.Red).height(50.dp),contentAlignment = Alignment.Center) {Text(text = item.name,style = MaterialTheme.typography.body1,fontSize = 14.sp)}
}

分析一下代码

//ComponentActivity 是一个基础活动类,提供了与用户界面的相关功能,例如生命周期管理和设置视图等。它是 Jetpack Compose 的一个活动基类。
class ListActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)//setContent 是 Jetpack Compose 的一个方法,用于设置 Compose 的内容。它接受一个 Composable 函数作为参数,这个函数定义了 UI 的组成部分。setContent {//MyComposeTheme 是一个自定义的主题函数,用于定义 Compose 应用的主题和样式。它通常会包含对颜色、形状、字体等主题属性的定义。使用主题函数可以确保应用的 UI 风格一致,并且可以通过主题轻松地调整样式。MyComposeTheme {//Surface 是一个 Compose 组件,用于绘制具有背景颜色和边界的矩形区域。它通常用于为 UI 元素提供背景和边框。Surface(modifier = Modifier.fillMaxSize(),color = Color.Green) {DynamicItemsList()}}}}
}

Surface 源码

@Composable
fun Surface(modifier: Modifier = Modifier,shape: Shape = RectangleShape,color: Color = MaterialTheme.colors.surface,contentColor: Color = contentColorFor(color),border: BorderStroke? = null,elevation: Dp = 0.dp,content: @Composable () -> Unit
) {Surface(modifier = modifier,shape = shape,color = color,contentColor = contentColor,border = border,elevation = elevation,content = content,clickAndSemanticsModifier = Modifier.semantics(mergeDescendants = false) {}.pointerInput(Unit) { })
}

modifier:用于修饰组件的外观和行为,默认为 Modifier(即没有任何修饰)。
shape:定义组件的形状,默认为 RectangleShape(矩形)。
color:定义组件的背景色,默认为 MaterialTheme.colors.surface(主题的表面颜色)。
contentColor:定义组件的内容颜色,默认为基于 color 计算得到的值。
border:可选的边框样式,默认为 null(没有边框)。
elevation:组件的阴影高度,默认为 0.dp(没有阴影)。
content:接收一个 Composable 函数作为参数,用于定义组件内部的内容。

这个 Surface 是Android Compose自带的,但是 DynamicItemsList 是我们自己自定义的

@Composable
fun DynamicItemsList() {val items by remember { mutableStateOf(mutableStateListOf<Item>()) }fun addItem() {val newItem = Item(id = items.size + 1, name = "Item ${items.size + 1}")items.add(newItem)}Column(Modifier.fillMaxSize().padding(16.dp)) {Button(onClick = { addItem() }, modifier = Modifier.fillMaxWidth()) {Text(text = "ADD Item")}Spacer(modifier = Modifier.height(10.dp))LazyColumn(modifier = Modifier.fillMaxWidth().background(Color.White)) {items(items) { item ->ItemView(item = item)}}}
}

这个 DynamicItemsList 里面的这个 ItemView 也是我们自定义的

@Composable
fun ItemView(item: Item) {Box(modifier = Modifier.fillMaxWidth().padding(8.dp).background(Color.LightGray).border(2.dp, color = Color.Red).height(50.dp),contentAlignment = Alignment.Center) {Text(text = item.name,style = MaterialTheme.typography.body1,fontSize = 14.sp)}
}

在Compose中,要是自定义一个Compose函数,需要满足:

1.使用 @Composable 注解:标记函数为 Composable 函数,使其能够用于声明式 UI 构建。
2.函数参数:可以包含需要的参数来定义组件的外观和行为。参数通常包括修饰符、颜色、形状等。
3.函数体:在函数体中调用其他 Composable 函数来构建 UI。

例如,定义一个简单的自定义按钮组件:

@Composable
fun CustomButton(onClick: () -> Unit,modifier: Modifier = Modifier,backgroundColor: Color = Color.Blue,content: @Composable () -> Unit
) {Button(onClick = onClick,modifier = modifier,colors = ButtonDefaults.buttonColors(backgroundColor = backgroundColor),content = content)
}

在这个示例中:

1.@Composable 标记函数为 Composable。
2.CustomButton 接收 onClick 回调、修饰符、背景色和内容作为参数。
3.函数体内部使用 Button Composable 函数构建实际的 UI 元素,并应用传入的参数。

回到项目代码里面,在这个 ItemView 函数里面

@Composable
//ItemView 函数接受一个 Item 类型的参数,用于传递要显示的数据。
fun ItemView(item: Item) {
//Box 是一个容器 Composable,用于排列其子组件。Box(modifier = Modifier.fillMaxWidth().padding(8.dp).background(Color.LightGray).border(2.dp, color = Color.Red).height(50.dp),contentAlignment = Alignment.Center) {//Text 用于显示文本内容。Text(text = item.name,style = MaterialTheme.typography.body1,fontSize = 14.sp)}
}

其中里面用到了 Text 和 Box两个函数

Text

@Composable
fun Text(text: String,modifier: Modifier = Modifier,color: Color = Color.Unspecified,fontSize: TextUnit = TextUnit.Unspecified,fontStyle: FontStyle? = null,fontWeight: FontWeight? = null,fontFamily: FontFamily? = null,letterSpacing: TextUnit = TextUnit.Unspecified,textDecoration: TextDecoration? = null,textAlign: TextAlign? = null,lineHeight: TextUnit = TextUnit.Unspecified,overflow: TextOverflow = TextOverflow.Clip,softWrap: Boolean = true,maxLines: Int = Int.MAX_VALUE,onTextLayout: (TextLayoutResult) -> Unit = {},style: TextStyle = LocalTextStyle.current
) {Text(AnnotatedString(text),modifier,color,fontSize,fontStyle,fontWeight,fontFamily,letterSpacing,textDecoration,textAlign,lineHeight,overflow,softWrap,maxLines,emptyMap(),onTextLayout,style)
}

text: String:要显示的文本内容。
modifier: Modifier = Modifier:用于修饰和布局组件的 Modifier,默认为 Modifier。
color: Color = Color.Unspecified:文本颜色,默认为 Color.Unspecified 表示不设置颜色。
fontSize: TextUnit = TextUnit.Unspecified:文本字体大小,默认为 TextUnit.Unspecified 表示不设置。
fontStyle: FontStyle? = null:字体样式,默认为 null 表示不设置。
fontWeight: FontWeight? = null:字体粗细,默认为 null 表示不设置。
fontFamily: FontFamily? = null:字体家族,默认为 null 表示使用默认字体。
letterSpacing: TextUnit = TextUnit.Unspecified:字母间距,默认为 TextUnit.Unspecified 表示不设置。
textDecoration: TextDecoration? = null:文本装饰(如下划线),默认为 null 表示不设置。
textAlign: TextAlign? = null:文本对齐方式,默认为 null 表示不设置。
lineHeight: TextUnit = TextUnit.Unspecified:行高,默认为 TextUnit.Unspecified 表示不设置。
overflow: TextOverflow = TextOverflow.Clip:文本溢出处理方式,默认为 TextOverflow.Clip。
softWrap: Boolean = true:是否启用软换行,默认为 true。
maxLines: Int = Int.MAX_VALUE:最大行数,默认为 Int.MAX_VALUE,表示不限制行数。
onTextLayout: (TextLayoutResult) -> Unit = {}:文本布局完成后的回调函数,默认为空函数。
style: TextStyle = LocalTextStyle.current:文本样式,默认为当前主题的文本样式。

Box

@Composable
inline fun Box(modifier: Modifier = Modifier,contentAlignment: Alignment = Alignment.TopStart,propagateMinConstraints: Boolean = false,content: @Composable BoxScope.() -> Unit
) {val measurePolicy = rememberBoxMeasurePolicy(contentAlignment, propagateMinConstraints)Layout(content = { BoxScopeInstance.content() },measurePolicy = measurePolicy,modifier = modifier)
}

modifier: Modifier = Modifier

Modifier 是用于修饰和布局组件的类。默认值是 Modifier,即不进行任何额外修饰。

contentAlignment: Alignment = Alignment.TopStart

控制 Box 内部内容的对齐方式。Alignment.TopStart 表示默认的内容对齐方式是顶部开始(即左上角)。

propagateMinConstraints: Boolean = false

如果为 true,Box 会将其最小尺寸约束传播给子组件。默认值为 false,即不会传播最小约束。

content: @Composable BoxScope.() -> Unit

这是一个 Composable Lambda,用于定义 Box 内部的子组件内容。BoxScope 是一个作用域,在 content 中可以访问。

接下来是我们定义的另一个函数 DynamicItemsList

@Composable
fun DynamicItemsList() {
//items:这是一个可变的状态列表,使用 mutableStateListOf 创建。by remember 确保状态在组合过程中保持一致。
//mutableStateListOf<Item>():创建一个可以观察的、可变的 List。这意味着,当列表的内容发生变化时,Compose 会自动重新组合相关的 UI 部分。//mutableStateOf(...):包装 mutableStateListOf,使其成为一个状态对象。Compose 能够检测到 mutableStateOf 包装的对象的变化,从而重新组合 UI。//remember { ... }:在组合过程中记住 mutableStateOf 返回的状态对象,确保状态在重组时保持一致。//val items by ...:使用 by 委托将 items 绑定到状态对象。这样,items 就是一个直接的、可读写的可变状态列表。val items by remember { mutableStateOf(mutableStateListOf<Item>()) }//addItem:创建一个新的 Item 对象并将其添加到 items 列表中。id 和 name 基于列表的大小生成。fun addItem() {val newItem = Item(id = items.size + 1, name = "Item ${items.size + 1}")items.add(newItem)}
//Column:垂直布局容器Column(Modifier.fillMaxSize().padding(16.dp)) {//Button按钮Button(onClick = { addItem() }, modifier = Modifier.fillMaxWidth()) {Text(text = "ADD Item")}//Spacer添加垂直间隔。Spacer(modifier = Modifier.height(10.dp))//LazyColumn用于垂直展示可滚动的列表。LazyRow用于横向滚动LazyColumn(modifier = Modifier.fillMaxWidth().background(Color.White)) {//items(items):将 items 列表中的每个 item 传递给 ItemView 组件。items(items) { item ->ItemView(item = item)}}}
}

【Column】

@Composable
inline fun Column(modifier: Modifier = Modifier,verticalArrangement: Arrangement.Vertical = Arrangement.Top,horizontalAlignment: Alignment.Horizontal = Alignment.Start,content: @Composable ColumnScope.() -> Unit
) {val measurePolicy = columnMeasurePolicy(verticalArrangement, horizontalAlignment)Layout(content = { ColumnScopeInstance.content() },measurePolicy = measurePolicy,modifier = modifier)
}

modifier: Modifier = Modifier: Modifier 是用于修饰和调整布局的参数,例如设置边距、填充、对齐等。默认值为 Modifier,即没有附加任何修饰符。

verticalArrangement: Arrangement.Vertical = Arrangement.Top: Arrangement.Vertical 定义了子项在垂直方向上的排列方式。Arrangement.Top 表示子项从容器顶部开始排列。其他值如 Arrangement.Center、Arrangement.Bottom 等可以调整排列方式。

horizontalAlignment: Alignment.Horizontal = Alignment.Start: Alignment.Horizontal 定义了子项在水平方向上的对齐方式。Alignment.Start 表示子项在容器的开始(左侧)对齐。其他值如 Alignment.CenterHorizontally、Alignment.End 等可以调整对齐方式。

content: @Composable ColumnScope.() -> Unit: 这是一个 lambda 函数类型的参数,代表了 Column 的子内容。ColumnScope 是一个特定的作用域,允许在 content 中使用 Column 相关的函数来添加子项。

【Button】

@Composable
fun Button(onClick: () -> Unit,modifier: Modifier = Modifier,enabled: Boolean = true,interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },elevation: ButtonElevation? = ButtonDefaults.elevation(),shape: Shape = MaterialTheme.shapes.small,border: BorderStroke? = null,colors: ButtonColors = ButtonDefaults.buttonColors(),contentPadding: PaddingValues = ButtonDefaults.ContentPadding,content: @Composable RowScope.() -> Unit
) {val contentColor by colors.contentColor(enabled)Surface(modifier = modifier,shape = shape,color = colors.backgroundColor(enabled).value,contentColor = contentColor.copy(alpha = 1f),border = border,elevation = elevation?.elevation(enabled, interactionSource)?.value ?: 0.dp,onClick = onClick,enabled = enabled,role = Role.Button,interactionSource = interactionSource,indication = rememberRipple()) {CompositionLocalProvider(LocalContentAlpha provides contentColor.alpha) {ProvideTextStyle(value = MaterialTheme.typography.button) {Row(Modifier.defaultMinSize(minWidth = ButtonDefaults.MinWidth,minHeight = ButtonDefaults.MinHeight).padding(contentPadding),horizontalArrangement = Arrangement.Center,verticalAlignment = Alignment.CenterVertically,content = content)}}}
}

onClick: () -> Unit: 点击按钮时调用的回调函数。

modifier: Modifier = Modifier: 用于修饰按钮的 Modifier,可以设置尺寸、边距等。

enabled: Boolean = true: 按钮是否启用,默认为 true。

interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }: 用于处理按钮的交互状态。

elevation: ButtonElevation? = ButtonDefaults.elevation(): 按钮的阴影效果,默认为 ButtonDefaults.elevation(),即系统默认值。

shape: Shape = MaterialTheme.shapes.small: 按钮的形状,默认为 MaterialTheme 中定义的小形状。

border: BorderStroke? = null: 按钮的边框样式,默认为 null,即没有边框。

colors: ButtonColors = ButtonDefaults.buttonColors(): 按钮的颜色配置,默认为系统默认颜色。

contentPadding: PaddingValues = ButtonDefaults.ContentPadding: 按钮内容的内边距,默认为系统默认值。

content: @Composable RowScope.() -> Unit: 按钮的内容,使用 RowScope 作用域来定义其布局。

【Spacer】

@Composable
fun Spacer(modifier: Modifier) {Layout({}, modifier) { _, constraints ->with(constraints) {val width = if (hasFixedWidth) maxWidth else 0val height = if (hasFixedHeight) maxHeight else 0layout(width, height) {}}}
}

【LazyColumn】

@Composable
fun LazyColumn(modifier: Modifier = Modifier,state: LazyListState = rememberLazyListState(),contentPadding: PaddingValues = PaddingValues(0.dp),reverseLayout: Boolean = false,verticalArrangement: Arrangement.Vertical =if (!reverseLayout) Arrangement.Top else Arrangement.Bottom,horizontalAlignment: Alignment.Horizontal = Alignment.Start,flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),content: LazyListScope.() -> Unit
) {LazyList(stateOfItemsProvider = rememberStateOfItemsProvider(content),modifier = modifier,state = state,contentPadding = contentPadding,flingBehavior = flingBehavior,horizontalAlignment = horizontalAlignment,verticalArrangement = verticalArrangement,isVertical = true,reverseLayout = reverseLayout)
}

modifier: Modifier = Modifier:

modifier 用于设置 LazyColumn 的外观和布局特性,如宽度、高度、边距等。
state: LazyListState = rememberLazyListState():

state 管理列表的滚动状态,包括当前位置、可见项等。
rememberLazyListState() 是一个用于记住列表状态的函数。
contentPadding: PaddingValues = PaddingValues(0.dp):

contentPadding 设置列表内容的内边距。
默认值是 0.dp,表示没有内边距。
reverseLayout: Boolean = false:

reverseLayout 决定列表的滚动方向。
如果为 true,列表将从底部开始显示到顶部;否则,从顶部开始显示到底部。
verticalArrangement: Arrangement.Vertical:

verticalArrangement 定义了垂直方向上子项的排列方式。
根据 reverseLayout 的值,设置为 Arrangement.Top 或 Arrangement.Bottom。
horizontalAlignment: Alignment.Horizontal = Alignment.Start:

horizontalAlignment 设置列表项在水平方向上的对齐方式。
默认是 Alignment.Start,即左对齐。
flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior():

flingBehavior 决定列表滚动的惯性行为。
默认使用 ScrollableDefaults.flingBehavior(),这是一个标准的惯性滚动行为。
content: LazyListScope.() -> Unit:

content 是一个 lambda 表达式,用于定义列表中的项。
在 LazyListScope 中,你可以使用 items 或 item 等函数来添加列表项。

我们发现,怎么每个函数都带一个【Modifier】?

【Modifier】 是 Jetpack Compose 中的一个核心概念,用于修改和定制组件的布局、外观和行为。每个 Compose 组件都可以接收一个 Modifier 参数来进行这些调整。

以下是一些常用的 Modifier 属性及其使用方法:

padding:
作用: 设置组件的内边距。
用法: Modifier.padding(all = 16.dp)Modifier.padding(start = 8.dp, end = 8.dp)background:
作用: 设置组件的背景颜色或背景图像。
用法: Modifier.background(Color.Gray)Modifier.background(brush = Brush.linearGradient(listOf(Color.Red, Color.Blue)))fillMaxWidth:
作用: 使组件宽度填充父容器的最大宽度。
用法: Modifier.fillMaxWidth()fillMaxHeight:
作用: 使组件高度填充父容器的最大高度。
用法: Modifier.fillMaxHeight()width 和 height:
作用: 设置组件的宽度和高度。
用法: Modifier.width(100.dp)Modifier.height(200.dp)size:
作用: 同时设置组件的宽度和高度。
用法: Modifier.size(100.dp)align:
作用: 设置组件在父容器中的对齐方式。
用法: Modifier.align(Alignment.Center)border:
作用: 为组件添加边框。
用法: Modifier.border(2.dp, Color.Black)clickable:
作用: 设置组件可以点击,并指定点击事件。
用法: Modifier.clickable { /* Handle click */ }graphicsLayer:
作用: 应用图形变换,如缩放、旋转、透明度等。
用法: Modifier.graphicsLayer(scaleX = 1.5f, scaleY = 1.5f)

通过组合和链式调用不同的 Modifier,可以很方便地实现复杂的 UI 布局和样式。


http://www.ppmy.cn/devtools/112518.html

相关文章

如何用SQL Server和Oracle进行数据同步?

数据同步是大数据应用中非常重要的环节&#xff0c;它可以保证数据的实时性和一致性&#xff0c;为数据分析和决策提供重要依据。常见的数据同步方式包括ETL实时同步和实时ETL工具&#xff0c;其中实时ETL工具又可以分为基于日志追踪和基于触发器两种。 针对不同的数据库系统&…

网络丢包是如何产生的

在网络通信过程中&#xff0c;数据以数据包的形式在发送方和接收方之间传输。理想状态下&#xff0c;所有数据包都应准确无误地到达目的地。然而&#xff0c;在实际的网络环境中&#xff0c;数据包可能会在传输过程中丢失&#xff0c;这种现象被称为网络丢包。网络丢包会导致数…

【PostgreSQL】Npgsql.PostgresException:“3D000:

情景再现 原因 Npgsql.PostgresException 指出发生了一个 PostgreSQL 数据库的异常。错误代码 3D000 通常与 PostGIS 扩展有关&#xff0c;这是 PostgreSQL 中用于管理空间数据的扩展。错误信息 "SpatialDatabase2" 表明可能是在操作一个空间数据库对象时出现了问题…

【LeetCode】每日一题 2024_9_14 从字符串中移除星号(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 今天的题目曾经的我做过了 . . . 又是复习的一天 题目&#xff1a;从字符串中移除星号 代码与解题思路 func removeStars(s string) string {// 本题的核心&#xff1a;生成的输入保证总是可以执行题面中…

Acwing 区间合并

区间合并 主要思想&#xff1a;给定很多区间。若两个区间有交集&#xff0c;将二者合并成一个区间。 具体做法: 先按照区间的左端点进行排序然后遍历每个区间&#xff0c;根据不同的情况进行合并&#xff0c;有一下几种情况&#xff1a; 第一种情况&#xff0c;区间不变&…

Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器

1、computed() 计算属性 在模板中绑定表达式只能用于简单的运算。如果运算比较复杂&#xff0c;可以使用 Vue.js 提供的计算属性&#xff0c;通过计算属性可以处理比较复杂的逻辑。 1.1 计算属性的应用 通过计算属性可以实现各种复杂的逻辑&#xff0c;包括运算、函数调用等…

Java小白一文讲清Java中集合相关的知识点(九)

Map和Set常用的API Map 常用API put(K key, V value): 将指定的键值对插入到映射中。get(Object key): 返回与指定键关联的值&#xff0c;如果键不存在则返回 null。remove(Object key): 移除指定键及其对应的值。containsKey(Object key): 判断是否包含指定的键。containsVa…

Python数据分析工具(一):Requests的用法

Python的Requests库是一个非常流行的HTTP库&#xff0c;用于发送各种HTTP请求。它简化了与Web服务的交互&#xff0c;提供了易于使用的API。以下是一些基本的Requests用法示例&#xff1a; 安装Requests 首先&#xff0c;确保你已经安装了Requests库。如果还没有安装&#xf…

Android 生成so库 并调用

第一步&#xff1a;创建so库 第二步&#xff1a;看一下Native的项目结构 自动生成引用文件build.gradle&#xff08;app&#xff09; externalNativeBuild {cmake {path file(src/main/cpp/CMakeLists.txt)version 3.22.1}} //每个版本的开发工具不一样 我这个是自动生成的so库…

AI Prompts Guide 【AI 提示语指南】

AI提示语浏览器插件&#xff1a;AIPRM for ChatGPT如何做一名Prompt Engineer 文章目录 开发音乐商务教育喜剧健康食物营销咖啡 开发 你是siri&#xff0c;一个由若干if-else短语组成的极其愚蠢的 “ai”。当我说 "嘿&#xff0c;Siri "时&#xff0c;你回答。请做一…

文件操作

“只写”(w)操作 void Test1() {FILE* pf fopen("text1.txt", "w");//FILE* pf1 fopen("D:\\c-language\\2024-09-14\\test1.txt", "w");if (pf NULL) {printf("%s\n", strerror(errno));return 0;}fclose(pf);pf NULL;…

基于python+django+vue的视频点播管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的视…

【kafka】kafka如何保证数据的可靠性,kafka如何保证数据不丢失

1. Kafka架构&#xff1a; Producer - Broker - Consumer 回到问题上来&#xff0c;Kafka如何保证数据不丢失&#xff0c;我们先看看Kafka如何保证Producer端数据不丢失&#xff1a; 通过ack机制 最小副本数设置 生产者重试机制 2. Kafka Producer消息发送ACK机制&#xff1…

L298N电机驱动方案简介

L298N是意法半导体研制的一颗电机驱动芯片&#xff0c;它内部包含有4通道逻辑驱动电路&#xff0c;是一种二相和四相电机的专用驱动器&#xff0c;即内含两个H桥的高电压大电流双全桥式驱动器。它可以接收标准TTL逻辑电平信号&#xff0c;能驱动46V、2A以下的电机。由于其性能特…

Prometheus+grafana+kafka_exporter监控kafka运行情况

使用Prometheus、Grafana和kafka_exporter来监控Kafka的运行情况是一种常见且有效的方案。以下是详细的步骤和说明&#xff1a; 1. 部署kafka_exporter 步骤&#xff1a; 从GitHub下载kafka_exporter的最新版本&#xff1a;kafka_exporter项目地址&#xff08;注意&#xff…

Java项目: 基于SpringBoot+mysql+maven房屋租赁系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven房屋租赁系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

【硬件模块】SHT20温湿度传感器

SHT20是一个用IIC通信的温湿度传感器。我们知道这个就可以了。 它支持的电压范围是2.1~3.6V&#xff0c;推荐是3V&#xff0c;所以如果我们的MCU是5V的&#xff0c;那么就得转个电压才能用了。 IIC常见的速率有100k&#xff0c;400k&#xff0c;而SHT20是支持400k的&#xff08…

ElasticSearch介绍+使用

ElasticSearch 1.背景 ElasticSearch的最明显的优势在于其分布式特性&#xff0c;能够扩展到上百台服务器&#xff0c;极大地提高了服务器的容错率。在大数据时代背景下&#xff0c;ElasticSearch与传统的数据库相比较&#xff0c;能够应对大规模的并发搜索请求&#xff0c;同…

python读写CSV文件

做数据分析&#xff0c;有时候要分析的数据在CSV文件里&#xff1b;先看一下python读写CSV文件&#xff1b; import pandas as pddf pd.read_csv(test1.csv) print(df) print() print(df.head(2))companyname ["A1", "B2", "E3", "F4&qu…

Spring Boot母婴商城:安全、便捷、高效

2 相关技术 2.1 SSM框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SSM&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c;SSM框架也可以&#xff0c;SpringMVC也可以。SSH框架…