jetpack組件----聲明式UI:compose(二):列表與列表點擊事件

學(xué)習(xí)了compose始終讓我覺得他不是很有必要向拆,但看了它對列表實現(xiàn)的部分覺得是真的香轴捎,原來我們寫列表就是定義一個recycleview般渡,然后寫它的item布局,然后寫適配器具钥,最后在activity里面對recycleview的適配器進(jìn)行初始化豆村,真的很麻煩,我很早就覺得這種寫列表太反人類骂删,現(xiàn)在我們看看compose的列表怎么實現(xiàn)掌动。
在compose中實現(xiàn)列表主要是兩種方法,Compose 提供了一組組件宁玫,這些組件只會對在組件視口中可見的列表項進(jìn)行組合和布局粗恢。這些組件包括 LazyColumnLazyRow
顧名思義,LazyColumnLazyRow 之間的區(qū)別就在于它們的列表項布局和滾動方向不同欧瘪。LazyColumn 生成的是垂直滾動列表眷射,而 LazyRow 生成的是水平滾動列表。

下面我們以垂直列表為例。
首先實現(xiàn)LazyColumn妖碉,寫一個方法去實現(xiàn)LazyColumn

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

這個方法接收一個message2類型的列表涌庭,message2是一個數(shù)據(jù)類

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

我們接收到數(shù)據(jù)類以后調(diào)用LazyColumn里的Items方法,將接受到的message2類型列表傳入items方法欧宜,再調(diào)用showview方法展示界面坐榆,注意這里lambuda表達(dá)式傳入的是每一個遍歷的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 = "聯(lián)系人照片",
                    modifier = Modifier
                        .size(60.dp)
                        .scale(1.0F),
                    contentScale = ContentScale.FillBounds
                )
            }
            Spacer(modifier = Modifier.width(8.dp))
            var isExpand by remember {
                mutableStateOf(false)
            }//創(chuàng)建一個開關(guān)值賦值為FALSE冗茸,委托remeber去記住這個開關(guān)值
            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,//如果開關(guān)值為TRUE展開全部席镀,否則只顯示一行
                    style = MaterialTheme.typography.body2
                )
            }
        }
    }
}

這個方法是界面方法,里面其他的上一篇文章都講過了夏漱,不同的是有三個地方需要注意:
1豪诲、這里是我需要實現(xiàn)點擊某一項item以后展開它的內(nèi)容,所以需要一個開關(guān)去判斷點擊的狀態(tài)從而更新ui挂绰,所以創(chuàng)建一個開關(guān)值賦值為FALSE跛溉,委托remeber去記住這個開關(guān)值,關(guān)于狀態(tài)委托這種扮授,大家可以去學(xué)習(xí)一下MutableState的源碼芳室,還是很好用的。

var isExpand by remember {
                mutableStateOf(false)
            }//創(chuàng)建一個開關(guān)值賦值為FALSE刹勃,委托remeber去記住這個開關(guān)值

2堪侯、就是一個if。荔仁。else伍宦。。的語句乏梁,如果點擊則展開全部次洼,否則只顯示一行。

  maxLines = if (isExpand) Int.MAX_VALUE else 1,//如果開關(guān)值為TRUE展開全部遇骑,否則只顯示一行

3卖毁、點擊事件,改變開關(guān)

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

下面是完整的代碼落萎,需要實現(xiàn)的小伙伴記得自己換一下包名和圖片路徑亥啦。

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 = "聯(lián)系人照片",
                    modifier = Modifier
                        .size(60.dp)
                        .scale(1.0F),
                    contentScale = ContentScale.FillBounds
                )
            }
            Spacer(modifier = Modifier.width(8.dp))
            var isExpand by remember {
                mutableStateOf(false)
            }//創(chuàng)建一個開關(guān)值賦值為FALSE,委托remeber去記住這個開關(guān)值
            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,//如果開關(guān)值為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日",
            "魯迅作品題材廣泛翔脱,形式多樣靈活,風(fēng)格鮮明獨特媒鼓,語言幽默届吁。在他55年的人生中错妖,創(chuàng)作的作品,體裁涉及小說疚沐、雜文站玄、散文、詩歌等濒旦。有《魯迅全集》二十卷1000余萬字傳世。在中華人民共和國成立后再登,其多篇作品被選入中小學(xué)語文教材尔邓,對新中國的語言和文學(xué)有著深遠(yuǎn)的影響。\n" +
                    "\n" +
                    "魯迅的作品主要以小說锉矢、雜文為主梯嗽,代表作有:小說集《吶喊》《彷徨》《故事新編》等 ;散文集《朝花夕拾》沽损;散文詩集《野草》灯节;雜文集《墳》《熱風(fēng)》《華蓋集》《華蓋集續(xù)編》《南腔北調(diào)集》《三閑集》《二心集》《而已集》《且介亭雜文》等。他的作品有數(shù)十篇被選入中绵估、小學(xué)語文課本炎疆,并有多部小說被先后改編成電影。其作品對于五四運動以后的中國文學(xué)產(chǎ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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末形入,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缝左,更是在濱河造成了極大的恐慌亿遂,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渺杉,死亡現(xiàn)場離奇詭異蛇数,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)是越,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門耳舅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人倚评,你說我怎么就攤上這事挽放。” “怎么了蔓纠?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵辑畦,是天一觀的道長。 經(jīng)常有香客問我腿倚,道長纯出,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮暂筝,結(jié)果婚禮上箩言,老公的妹妹穿的比我還像新娘。我一直安慰自己焕襟,他們只是感情好陨收,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸵赖,像睡著了一般务漩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上它褪,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天饵骨,我揣著相機(jī)與錄音,去河邊找鬼茫打。 笑死居触,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的老赤。 我是一名探鬼主播轮洋,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抬旺!你這毒婦竟也來了砖瞧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤嚷狞,失蹤者是張志新(化名)和其女友劉穎块促,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體床未,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡竭翠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了薇搁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斋扰。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖啃洋,靈堂內(nèi)的尸體忽然破棺而出传货,到底是詐尸還是另有隱情,我是刑警寧澤宏娄,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布问裕,位于F島的核電站,受9級特大地震影響孵坚,放射性物質(zhì)發(fā)生泄漏粮宛。R本人自食惡果不足惜窥淆,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巍杈。 院中可真熱鬧忧饭,春花似錦、人聲如沸筷畦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳖宾。三九已至吼砂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間攘滩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工纸泡, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留漂问,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓女揭,卻偏偏與公主長得像蚤假,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吧兔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容