简体   繁体   English

如何在 Jetpack Compose 中制作无穷无尽的列表

[英]How to make an endless list in Jetpack Compose

When make an xml endless list need create RecyclerView and add RecyclerViewOnScrollListener .制作 xml 无限列表时需要创建RecyclerView并添加RecyclerViewOnScrollListener How to do it in Jetpack Compose?如何在 Jetpack Compose 中执行此操作?

You can use androidx.ui.foundation.AdapterList for this.您可以为此使用androidx.ui.foundation.AdapterList It will only composes and lays out the currently visible items.它只会组合和布置当前可见的项目。

@Composable
fun CustomerListView(list: List<Customer>) {

    AdapterList(data = list) { customer->

       Text("name:${customer.name}") 
    }
}

You could use LazyColumnFor like explained here :您可以使用LazyColumnFor ,如下所述:

@Composable
fun LazyColumnForDemo() {
    LazyColumnFor(items = listOf(
            "A", "B", "C", "D"
    ) + ((0..100).map { it.toString() }),
            modifier = Modifier,
            itemContent = { item ->
                Log.d("COMPOSE", "This get rendered $item")
                when (item) {
                    "A" -> {
                        Text(text = item, style = TextStyle(fontSize = 80.sp))
                    }
                    "B" -> {
                        Button(onClick = {}) {
                            Text(text = item, style = TextStyle(fontSize = 80.sp))
                        }
                    }
                    "C" -> {
                        //Do Nothing
                    }
                    "D" -> {
                        Text(text = item)
                    }
                    else -> {
                        Text(text = item, style = TextStyle(fontSize = 80.sp))
                    }
                }
            })
}

Explained by google here: https://youtu.be/SMOhl9RK0BA 23:18谷歌在这里解释: https://youtu.be/SMOhl9RK0BA 23:18

Similar to endless list in RecyclerView with some tunes:类似于 RecyclerView 中的无限列表,带有一些曲调:

@Parcelize
data class PagingController(
    var loading: Boolean = false,
    var itemsFromEndToLoad: Int = 5,
    var lastLoadedItemsCount: Int = 0,
) : Parcelable {

    fun reset() {
        loading = false
        itemsFromEndToLoad = 5
        lastLoadedItemsCount = 0
    }
}

@Composable
fun LazyGridState.endlessOnScrollListener(
    pagingController: PagingController,
    itemsCount: Int, // provide real collection size to not have collisions if list contains another view types
    loadMore: () -> Unit
) {
    if (!isScrollInProgress) return

    val lastVisiblePosition = layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0
    pagingController.run {
        if (loading) {
            if (itemsCount > lastLoadedItemsCount) {
                loading = false
                Timber.v("loaded, lastVisiblePosition: $lastVisiblePosition, itemsCount: $itemsCount")
                lastLoadedItemsCount = itemsCount
            }
        } else {
            if (itemsCount < lastLoadedItemsCount) {
                Timber.v("list reset")
                reset()
            }
            val needToLoad = lastVisiblePosition + itemsFromEndToLoad >= itemsCount
            if (needToLoad) {
                Timber.v("loading, lastVisiblePosition: $lastVisiblePosition, itemsCount: $itemsCount")
                loading = true
                loadMore()
            }
        }
    }
}

 val gridState = rememberLazyGridState()
 LazyVerticalGrid(
     ...
     state = gridState,
 ) { ... 
 }

 val pagingController by rememberSaveable { mutableStateOf(PagingController()) }
 gridState.endlessOnScrollListener(pagingController, dataList.size) {
    ... // loadNextPage
 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM