中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android?Jetpack?Compose如何實現列表吸頂效果

發布時間:2022-02-23 09:14:45 來源:億速云 閱讀:394 作者:iii 欄目:開發技術

這篇文章主要介紹“Android Jetpack Compose如何實現列表吸頂效果”,在日常操作中,相信很多人在Android Jetpack Compose如何實現列表吸頂效果問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Android Jetpack Compose如何實現列表吸頂效果”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    安卓傳統的 Recyclerview 打造懸浮頭部StickyHeader的吸頂效果,十分麻煩,而在Compose中就簡單多了

    stickyHeader

    Compose設計的時候考慮得很周到,他們提供了stickyHeader

    作用就是添加一個粘性標題項,即使在它后面滾動時也會保持固定。標頭將保持固定,直到下一個標頭取而代之。

    參數key - 表示唯一的密鑰鍵。

    它不允許對列表出現使用相同的鍵。密鑰的類型應該可以通過 Bundle 保存。如果傳遞了 null,則列表中的位置將代表鍵。當指定鍵時,滾動位置將基于該鍵保持,這意味著如果在當前可見項目之前添加刪除項目,則具有給定鍵的項目將保留為第一個可見項目。

    參數content 傳入Composable控件就即可顯示

    實體類

    創建一個實體類標題和內容

    data class Post(
        val title:String,
        val contentData:List<String>
    )

    加載假數據

    val list : MutableList<Post> = mutableListOf()
    for (index in 1..10) {
        val contentData :MutableList<String> = mutableListOf()
        for (i in 1..30){
            contentData.add("內容 $i")
        }
        list.add(Post("標題$index",contentData))
    }

    定義一個垂直滾動列表,僅構成和布局當前可見的項目

    LazyColumn {
        list.forEachIndexed { position, post ->
            stickyHeader {
                ListTitle(title = post.title)
            }
    
            items(post.contentData.size) { route ->
                StructureItem(post.contentData)
            }
            if (position <= list.size - 1) {
                Divider()
            }
            Spacer(modifier = Modifier.height(10.dp))
        }
    }

    吸頂標題

    接著封裝一個吸頂標題,并傳出點擊事件

    @Composable
    fun ListTitle(
        onSubtitleClick: () -> Unit = {}
    ) {
            MediumTitle(
                title = title,
                modifier = Modifier.align(Alignment.CenterVertically).clickable {
                    onSubtitleClick.invoke()
                }
    }

    效果圖

    Android?Jetpack?Compose如何實現列表吸頂效果

    二級條目

    接著寫二級條目

    FlowRow可以將其子項置于水平流中的可組合項。如果水平空間太小而無法將所有子項放在一行中,則可能會使用多行。傳統的流式布局

    用法很簡單,和row一樣

    FlowRow {
        for (item in bean) {
            TextButton(
               ....
            }
        }
    }

    在content可組控件里面添加多個TextButton即可

    fun StructureItem{
        Column{
            FlowRow() {
                for (item in bean) {
                    TextButton
                    {
                        Text()
                    }
    
                }
            }
    
        }
    }

    效果圖

    Android?Jetpack?Compose如何實現列表吸頂效果

    接著吸頂標題放在LazyColumn里面就完成了

    LazyColumn() {
        list.forEachIndexed { position, post ->
            stickyHeader {
                ListTitle(title = post.title) {
                    //點擊事件
                }
            }
            item {
                StructureItem(post.contentData)
                Spacer(modifier = Modifier.height(10.dp))
            }
        }
    }

    完整代碼

    @OptIn(ExperimentalFoundationApi::class)
    @Composable
    fun StickyHeaderScreen() {
        val list: MutableList<Post> = mutableListOf()
        for (index in 1..10) {
            val contentData: MutableList<String> = mutableListOf()
            for (i in 1..12) {
                contentData.add("內容 $i")
            }
            list.add(Post("標題$index", contentData))
        }
        LazyColumn(
            modifier = Modifier
                .fillMaxWidth()
                .fillMaxHeight(),
            contentPadding = PaddingValues(vertical = 10.dp)
        ) {
            list.forEachIndexed { position, post ->
                stickyHeader {
                    ListTitle(title = post.title) {
                        //點擊事件
                    }
                }
                item {
                    StructureItem(post.contentData)
                    Spacer(modifier = Modifier.height(10.dp))
                }
            }
        }
    }
    
    data class Post(
        val title: String,
        val contentData: List<String>
    )
    
    @Composable
    fun ListTitle(
        modifier: Modifier = Modifier,
        title: String,
        isLoading: Boolean = false,
        onSubtitleClick: () -> Unit = {}
    ) {
        Row(
            modifier = modifier
                .placeholder(false)
                .fillMaxWidth()
                .height(ListTitleHeight)
                .background(color = Color.Gray)
        ) {
            Box(
                modifier = Modifier
                    .padding(horizontal = 10.dp)
                    .width(5.dp)
                    .height(16.dp)
                    .align(Alignment.CenterVertically)
                    .background(color = Color.Black)
            )
            MediumTitle(
                title = title,
                color = Color.Black,
                modifier = Modifier.align(Alignment.CenterVertically).clickable {
                    onSubtitleClick.invoke()
                },
                isLoading = isLoading
            )
            Spacer(modifier = Modifier.weight(1f))
        }
    
    }
    
    
    @Composable
    fun StructureItem(
        bean: List<String>
    ) {
        Column(
            modifier = Modifier
                .fillMaxWidth()
                .padding(top = 10.dp)
        ) {
    
            FlowRow(
                modifier = Modifier.padding(horizontal = 6.dp)
            ) {
    
    
                for (item in bean) {
                    Box(modifier = Modifier.padding(horizontal = 2.dp, vertical = 3.dp)) {
                        TextButton(
                            modifier = Modifier.padding(horizontal = 3.dp).height(34.dp),
                            shape = RoundedCornerShape(12.dp),
                            onClick = { },
                            colors = ButtonDefaults.textButtonColors(
                                backgroundColor = themeColor
                            )
                        )
                        {
                            Text(
                                item,
                                color = Color.White
                            )
                        }
    
                    }
                }
            }
    
        }
    }

    效果圖

    Android?Jetpack?Compose如何實現列表吸頂效果

    到此,關于“Android Jetpack Compose如何實現列表吸頂效果”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    赤水市| 江口县| 上高县| 娱乐| 手机| 阿图什市| 彭水| 应用必备| 温泉县| 伊通| 宁津县| 长泰县| 清徐县| 华宁县| 贵溪市| 中卫市| 古田县| 温宿县| 斗六市| 龙口市| 江门市| 大理市| 桃园县| 塘沽区| 霞浦县| 会同县| 大渡口区| 镇原县| 富平县| 贞丰县| 温宿县| 安康市| 志丹县| 东安县| 通州市| 南京市| 澳门| 玛纳斯县| 出国| 新兴县| 奈曼旗|