android - Jetpack Compose 不会在 setValue 上重新组合可组合
问题描述
我正在尝试使用Jetpack
compose 做一个快速分页示例,在其中加载列表的前 6 个项目,然后加载另一个 6,依此类推,直到列表末尾。
我知道 for 循环中的错误会导致IndexOutOfBounds
因为没有很好地设计迭代直到数组的最后一个元素
我的问题是两个,首先是for循环一个,我不知道如何取自0 - 6 , 6 - 12 - 12 - list.size
然后我的另一个问题是,每次我使用 setList 它都应该重新组合LazyColumnForIndex
而不是重新组合,导致只呈现前 6 个项目
我在这里做错了什么?
val longList = mutableListOf("Phone","Computer","TV","Glasses","Cup",
"Stereo","Music","Furniture","Air","Red","Blue","Yellow",
"White","Black","Pink","Games","Car","Motorbike")
@Composable
fun PaginationDemo() {
val maxItemsPerPage = 6
val list = mutableListOf<String>()
var (page,setValue) = remember { mutableStateOf(1) }
val (paginatedList,setList) = remember { mutableStateOf(getPaginatedList(page,maxItemsPerPage, list)) }
LazyColumnForIndexed(items = paginatedList ) { index, item ->
Text(text = item,style = TextStyle(fontSize = 24.sp))
if(paginatedList.lastIndex == index){
onActive(callback = {
setValue(page++)
setList(getPaginatedList(page,maxItemsPerPage,list))
})
}
}
}
private fun getPaginatedList(page:Int,maxItemsPerPage:Int,list:MutableList<String>): MutableList<String> {
val startIndex = maxItemsPerPage * page
for(item in 0 until startIndex){
list.add(longList[item])
}
return list
}
解决方案
这似乎有效。
@Composable
fun PaginationDemo() {
val maxItemsPerPage = 6
val list = mutableStateListOf<String>()
var (page,setValue) = remember { mutableStateOf(1) }
val (paginatedList,setList) = remember { mutableStateOf(getPaginatedList(page,maxItemsPerPage, list)) }
LazyColumnForIndexed(
items = paginatedList
) { index, item ->
Text(
text = item,
style = TextStyle(fontSize = 24.sp),
modifier = Modifier
.fillParentMaxWidth()
.height((ConfigurationAmbient.current.screenHeightDp / 3).dp)
.background(color = Color.Blue)
)
Divider(thickness = 2.dp)
Log.d("MainActivity", "lastIndex = ${paginatedList.lastIndex} vs index = $index")
if(paginatedList.lastIndex == index){
onActive(callback = {
setValue(++page)
setList(getPaginatedList(page,maxItemsPerPage,list))
})
}
}
}
private fun getPaginatedList(page:Int,maxItemsPerPage:Int,list:MutableList<String>): MutableList<String> {
val maxSize = longList.size
val startIndex = if (maxItemsPerPage * page >= maxSize) maxSize else maxItemsPerPage * page
list.clear()
for(item in 0 until startIndex){
list.add(longList[item])
}
return list
}
推荐阅读
- vb.net - 以不同的形式将行添加到 DataGridView
- javascript - 在 App Store 上看起来很糟糕但在我看来不错的徽标问题
- r - 如何矢量化 R 中的子集函数?
- c# - 如何同时为一对多和多对多设置持久对象?[开发快递]
- machine-learning - NEAT 中的前馈算法(增强拓扑的神经演化)
- jquery - 当我有一个固定的标题时,如何给粘性条提供顶部偏移量
- javascript - 循环的现代语法与旧语法
- javascript - 有没有触发键盘的jQuery方法?
- javascript - 从 Javascript 调用 jar 中定义的 java 类
- reactjs - 使用外部应用程序打开 Electron 中打包的 PDF