jetpack组件----声明式UI:compose(二):列表与列表点击事件

学习了compose始终让我觉得他不是很有必要,但看了它对列表实现的部分觉得是真的香,原来我们写列表就是定义一个recycleview,然后写它的item布局,然后写适配器,最后在activity里面对recycleview的适配器进行初始化,真的很麻烦,我很早就觉得这种写列表太反人类,现在我们看看compose的列表怎么实现。
在compose中实现列表主要是两种方法,Compose 提供了一组组件,这些组件只会对在组件视口中可见的列表项进行组合和布局。这些组件包括 LazyColumnLazyRow
顾名思义,LazyColumnLazyRow 之间的区别就在于它们的列表项布局和滚动方向不同。LazyColumn 生成的是垂直滚动列表,而 LazyRow 生成的是水平滚动列表。

下面我们以垂直列表为例。
首先实现LazyColumn,写一个方法去实现LazyColumn

fun sampleRecycleview(msgList: MutableList<message2>) {
    LazyColumn {
        items(msgList) { message2 ->
            showview(msg = message2)
        }
    }
}

这个方法接收一个message2类型的列表,message2是一个数据类

data class message2(val name: String, val othername: String, val phone: String)

我们接收到数据类以后调用LazyColumn里的Items方法,将接受到的message2类型列表传入items方法,再调用showview方法展示界面,注意这里lambuda表达式传入的是每一个遍历的message2对象。showview方法就是界面方法

@Composable
fun showview(msg: message2) {
    ComposeDemoTheme {
        Row(modifier = Modifier.padding(all = 8.dp)) {
            Surface(
                modifier = Modifier.size(60.dp),
                shape = CircleShape
            ) {
                Image(
                    painter = painterResource(id = R.drawable.luxun),
                    contentDescription = "联系人照片",
                    modifier = Modifier
                        .size(60.dp)
                        .scale(1.0F),
                    contentScale = ContentScale.FillBounds
                )
            }
            Spacer(modifier = Modifier.width(8.dp))
            var isExpand by remember {
                mutableStateOf(false)
            }//创建一个开关值赋值为FALSE,委托remeber去记住这个开关值
            Column(modifier = Modifier.clickable { isExpand = !isExpand }) {
                Text(text = "作者: ${msg.name}!", fontSize = 14.sp)
                Text(text = "时间:${msg.othername}", fontSize = 14.sp)
                Text(
                    text = "主要成就:${msg.phone}",
                    fontSize = 14.sp,
                    color = MaterialTheme.colors.secondaryVariant,
                    maxLines = if (isExpand) Int.MAX_VALUE else 1,//如果开关值为TRUE展开全部,否则只显示一行
                    style = MaterialTheme.typography.body2
                )
            }
        }
    }
}

这个方法是界面方法,里面其他的上一篇文章都讲过了,不同的是有三个地方需要注意:
1、这里是我需要实现点击某一项item以后展开它的内容,所以需要一个开关去判断点击的状态从而更新ui,所以创建一个开关值赋值为FALSE,委托remeber去记住这个开关值,关于状态委托这种,大家可以去学习一下MutableState的源码,还是很好用的。

var isExpand by remember {
                mutableStateOf(false)
            }//创建一个开关值赋值为FALSE,委托remeber去记住这个开关值

2、就是一个if。。else。。的语句,如果点击则展开全部,否则只显示一行。

  maxLines = if (isExpand) Int.MAX_VALUE else 1,//如果开关值为TRUE展开全部,否则只显示一行

3、点击事件,改变开关

 Column(modifier = Modifier.clickable { isExpand = !isExpand })

下面是完整的代码,需要实现的小伙伴记得自己换一下包名和图片路径。

package com.example.composedemo

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.composedemo.ui.theme.ComposeDemoTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            DefaultPreview()
        }
    }
}

data class message2(val name: String, val othername: String, val phone: String)

@Composable
fun showview(msg: message2) {
    ComposeDemoTheme {
        Row(modifier = Modifier.padding(all = 8.dp)) {
            Surface(
                modifier = Modifier.size(60.dp),
                shape = CircleShape
            ) {
                Image(
                    painter = painterResource(id = R.drawable.luxun),
                    contentDescription = "联系人照片",
                    modifier = Modifier
                        .size(60.dp)
                        .scale(1.0F),
                    contentScale = ContentScale.FillBounds
                )
            }
            Spacer(modifier = Modifier.width(8.dp))
            var isExpand by remember {
                mutableStateOf(false)
            }//创建一个开关值赋值为FALSE,委托remeber去记住这个开关值
            Column(modifier = Modifier.clickable { isExpand = !isExpand }) {
                Text(text = "作者: ${msg.name}!", fontSize = 14.sp)
                Text(text = "时间:${msg.othername}", fontSize = 14.sp)
                Text(
                    text = "主要成就:${msg.phone}",
                    fontSize = 14.sp,
                    color = MaterialTheme.colors.secondaryVariant,
                    maxLines = if (isExpand) Int.MAX_VALUE else 1,//如果开关值为TRUE展开全部,否则只显示一行
                    style = MaterialTheme.typography.body2
                )
            }
        }
    }

}

@Composable
fun sampleRecycleview(msgList: MutableList<message2>) {
    LazyColumn {
        items(msgList) { message2 ->
            showview(msg = message2)
        }
    }
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    var msgList = mutableListOf<message2>()
    for (i in 0..20) {
        var msg = message2(
            "鲁迅",
            "1881年09月25日",
            "鲁迅作品题材广泛,形式多样灵活,风格鲜明独特,语言幽默。在他55年的人生中,创作的作品,体裁涉及小说、杂文、散文、诗歌等。有《鲁迅全集》二十卷1000余万字传世。在中华人民共和国成立后,其多篇作品被选入中小学语文教材,对新中国的语言和文学有着深远的影响。\n" +
                    "\n" +
                    "鲁迅的作品主要以小说、杂文为主,代表作有:小说集《呐喊》《彷徨》《故事新编》等 ;散文集《朝花夕拾》;散文诗集《野草》;杂文集《坟》《热风》《华盖集》《华盖集续编》《南腔北调集》《三闲集》《二心集》《而已集》《且介亭杂文》等。他的作品有数十篇被选入中、小学语文课本,并有多部小说被先后改编成电影。其作品对于五四运动以后的中国文学产生了深刻的影响。 "
        )
        msgList.add(msg)
    }
    sampleRecycleview(msgList = msgList)
}

效果图


Screenshot_2021-11-08-16-38-00-606_com.example.co.jpg

点击以后主要成就会全部展示出来:

Screenshot_2021-11-08-16-38-16-325_com.example.co.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容