如何在 Android Jetpack Compose 中将 LazyColumn stickyHeader 与 Paging 结合使用?

时间:2021-05-26 09:58:49

标签: android kotlin android-jetpack android-jetpack-compose android-paging

我已经使用 Paging 实现了 LazyColumn,但我现在还尝试添加 sticky headers

stickyHeader() 函数在 items() 范围内不可用,所以我不知道它应该如何工作。

@Composable
fun MovieList(movies: Flow<PagingData<Movie>>) {
    val lazyMovieItems: LazyPagingItems<Movie> = movies.collectAsLazyPagingItems()

    LazyColumn {
        // TODO: Add sticky headers
        items(lazyMovieItems) { movie ->
            MovieItem(movie = movie!!)
        }
    }
}

如何添加 stickyHeader

1 个答案:

答案 0 :(得分:1)

@Composable
fun MovieList(movies: Flow<PagingData<Movie>>) {
    val lazyMovieItems = movies.collectAsLazyPagingItems()

    LazyColumn {
        val itemCount = lazyMovieItems.itemCount
        var lastCharacter: Char? = null

        for (index in 0 until itemCount) {
            // Gets item without notifying Paging of the item access,
            // which would otherwise trigger page loads
            val movie = lazyMovieItems.peek(index)
            val character = movie?.name?.first()

            if (movie !== null && character != lastCharacter) {
                stickyHeader(key = character) {
                    MovieHeader(character)
                }
            }

            item(key = movie?.id) {
                // Gets item, triggering page loads if needed
                val movieItem = lazyMovieItems.getAsState(index).value

                Movie(movieItem)
            }

            lastCharacter = character
        }
    }
}