保姆级学习开发安卓手机软件(二十二)–通过实例了解列表控件,并简单讲解一些代码习惯

一、创建工程



distributionUrl=https\://mirrors.cloud.tencent.com/gradle
二、新增model软件包及数据类





@StringRes val stringResourceId: Int,//存储在字符串资源中的文本的 ID@DrawableRes val imageResourceId: Int//存储在可绘制资源中的图片的 ID
三、添加资源





<string name="affirmation1">I am strong.</string><stringname="affirmation2">I believe in myself.</string><stringname="affirmation3">Each day is a new opportunity to grow and be a better version of myself.</string><stringname="affirmation4">Every challenge in my life is an opportunity to learn from.</string><stringname="affirmation5">I have so much to be grateful for.</string><stringname="affirmation6">Good things are always coming into my life.</string><stringname="affirmation7">New opportunities await me at every turn.</string><stringname="affirmation8">I have the courage to follow my heart.</string><stringname="affirmation9">Things will unfold at precisely the right time.</string><stringname="affirmation10">I will be present in all the moments that this day brings.</string>
四、新建data软件包及类


import com.example.affirmations.Rimport com.example.affirmations.model.Affirmationclass Datasource {fun loadAffirmations(): List<Affirmation> {return listOf<Affirmation>(Affirmation(R.string.affirmation1, R.drawable.image1),Affirmation(R.string.affirmation2, R.drawable.image2),Affirmation(R.string.affirmation3, R.drawable.image3),Affirmation(R.string.affirmation4, R.drawable.image4),Affirmation(R.string.affirmation5, R.drawable.image5),Affirmation(R.string.affirmation6, R.drawable.image6),Affirmation(R.string.affirmation7, R.drawable.image7),Affirmation(R.string.affirmation8, R.drawable.image8),Affirmation(R.string.affirmation9, R.drawable.image9),Affirmation(R.string.affirmation10, R.drawable.image10))}}
五、构建UI

import com.example.affirmations.model.Affirmation
@ComposablefunAffirmationCard(affirmation: Affirmation, modifier: Modifier = Modifier) {//接受 Affirmation 对象作为形参,Affirmation 对象来自 model 软件包。//调用 Card 可组合项Card(modifier=modifier){Column{Image(painter = painterResource(affirmation.imageResourceId),contentDescription = stringResource(affirmation.stringResourceId),modifier= Modifier.fillMaxWidth().height(194.dp),contentScale = ContentScale.Crop//按比例放大 / 缩小(框内无空白,但图片可能被裁掉一部分。))Text(text = LocalContext.current.getString(affirmation.stringResourceId),modifier = Modifier.padding(16.dp),style = MaterialTheme.typography.headlineSmall//使用Material Design主题中定义的headlineSmall字体样式)}}}


六、构建列表
@ComposablefunAffirmationList(affirmationList: List<Affirmation>, modifier: Modifier = Modifier) {}
@ComposablefunAffirmationList(affirmationList: List<Affirmation>, modifier: Modifier = Modifier) {LazyColumn(modifier = modifier) {items(affirmationList) { singleAffirmation ->AffirmationCard(affirmation = singleAffirmation,modifier = Modifier.padding(8.dp))}}}

@ComposablefunGreeting(name: String, modifier: Modifier = Modifier) {val layoutDirection = LocalLayoutDirection.current//检索当前的布局方向并将其保存在变量中。它们将用于稍后配置内边距//创建一个 Surface 可组合项。此可组合项将设置 AffirmationsList 可组合项的内边距。Surface(modifier = Modifier.fillMaxSize().statusBarsPadding().padding(//将 LayoutDirection 对象转换为内边距start = WindowInsets.safeDrawing.asPaddingValues().calculateStartPadding(layoutDirection),end = WindowInsets.safeDrawing.asPaddingValues().calculateEndPadding(layoutDirection),),) {AffirmationList(affirmationList = Datasource().loadAffirmations(),//调用资源)}}


|
|
|
|---|---|
|
|
LazyColumn 上,列表的滚动范围会被压缩,甚至滚动条位置异常 |
|
|
LazyColumn 设置背景色,容易和 Card 样式冲突 |
|
|
|
夜雨聆风
