日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Android?Jetpack?Compose實(shí)現(xiàn)列表吸頂效果_Android

作者:九狼 ? 更新時(shí)間: 2022-04-26 編程語言

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

stickyHeader

Compose設(shè)計(jì)的時(shí)候考慮得很周到,他們提供了stickyHeader

作用就是添加一個(gè)粘性標(biāo)題項(xiàng),即使在它后面滾動(dòng)時(shí)也會(huì)保持固定。標(biāo)頭將保持固定,直到下一個(gè)標(biāo)頭取而代之。

參數(shù)key - 表示唯一的密鑰鍵。

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

參數(shù)content 傳入Composable控件就即可顯示

實(shí)體類

創(chuàng)建一個(gè)實(shí)體類標(biāo)題和內(nèi)容

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

加載假數(shù)據(jù)

val list : MutableList = mutableListOf()
for (index in 1..10) {
    val contentData :MutableList = mutableListOf()
    for (i in 1..30){
        contentData.add("內(nèi)容 $i")
    }
    list.add(Post("標(biāo)題$index",contentData))
}

定義一個(gè)垂直滾動(dòng)列表,僅構(gòu)成和布局當(dāng)前可見的項(xiàng)目

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))
    }
}

吸頂標(biāo)題

接著封裝一個(gè)吸頂標(biāo)題,并傳出點(diǎn)擊事件

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

效果圖

二級條目

接著寫二級條目

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

用法很簡單,和row一樣

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

在content可組控件里面添加多個(gè)TextButton即可

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

            }
        }

    }
}

效果圖

接著吸頂標(biāo)題放在LazyColumn里面就完成了

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

完整代碼

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun StickyHeaderScreen() {
    val list: MutableList = mutableListOf()
    for (index in 1..10) {
        val contentData: MutableList = mutableListOf()
        for (i in 1..12) {
            contentData.add("內(nèi)容 $i")
        }
        list.add(Post("標(biāo)題$index", contentData))
    }
    LazyColumn(
        modifier = Modifier
            .fillMaxWidth()
            .fillMaxHeight(),
        contentPadding = PaddingValues(vertical = 10.dp)
    ) {
        list.forEachIndexed { position, post ->
            stickyHeader {
                ListTitle(title = post.title) {
                    //點(diǎn)擊事件
                }
            }
            item {
                StructureItem(post.contentData)
                Spacer(modifier = Modifier.height(10.dp))
            }
        }
    }
}

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

@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
) {
    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
                        )
                    }

                }
            }
        }

    }
}

效果圖

左邊的黑邊是我裁剪的問題,抱歉啦!

原文鏈接:https://juejin.cn/post/7066821256800108575

欄目分類
最近更新