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

Dun*_*Luk 8 android kotlin android-jetpack android-paging android-jetpack-compose

我已经使用 Paging 实现了LazyColumn我现在也尝试添加粘性标题。

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!!)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何添加stickyHeaders?

Dun*_*Luk 10

@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[index]

                Movie(movieItem)
            }

            lastCharacter = character
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用此解决方案时要小心:每次用户获取新项目时,for 循环都会执行,如果您有很多结果(例如数十万或数百万),它很容易耗尽内存或降低滚动性能(考虑每次获取新页面时在 UI 线程上迭代超过一百万个项目)。 (2认同)