我目前正在试用新的Jetpack compose UI工具包,我非常喜欢它。有一件事我不知道如何在由分页库填充的LazyColumn
中使用stickyHeaders
。文档中的非分页示例是:
val grouped = contacts.groupBy { it.firstName[0] }
fun ContactsList(grouped: Map<Char, List<Contact>>) {
LazyColumn {
grouped.forEach { (initial, contactsForInitial) ->
stickyHeader {
CharacterHeader(initial)
}
items(contactsForInitial) { contact ->
ContactListItem(contact)
}
}
}
}
因为我使用的是分页库,所以不能使用groupedBy
,所以我尝试在PagingData
上使用insertSeparators
函数,并自己插入/创建头文件,如下所示(请忽略遗留的Date
代码,它只是用于测试):
// On my flow
.insertSeparators { before, after ->
when {
before == null -> ListItem.HeaderItem(after?.workout?.time ?: 0)
after == null -> ListItem.HeaderItem(before.workout.time)
(Date(before.workout.time).day != Date(after.workout.time).day) ->
ListItem.HeaderItem(before.workout.time)
// Return null to avoid adding a separator between two items.
else -> null
}
}
// In my composeable
LazyColumn {
items(workoutItems) {
when(it) {
is ListItem.HeaderItem -> this@LazyColumn.stickyHeader { Header(it) }
is ListItem.SongItem -> WorkoutItem(it)
}
}
}
但是这会产生一个我所有项的列表,并且头项会附加在末尾。在使用分页库时,什么是正确的stickyHeader
函数使用方法?
3条答案
按热度按时间inb24sb21#
我通过查看
items
函数的源代码使其工作:在items
函数中不能调用stickyHeader
,根本不需要修改PagingData流程,只需要使用peek在不触发重载的情况下获取下一项,然后布局即可:n1bvdmb62#
我相信您的代码中的问题是您从
LazyItemScope
内部调用this@LazyColumn
。我也用
insertSeparators
做了实验,得到了这个可以工作的LazyColumn代码:bzzcjhmw3#
最新的解决方案是: