RecyclerView がこういう頑張りをしないといけなかったので、こうやってしまう気持ちはわかります。
よくない例
@Composable
fun DogList(list: List<Dog>) {
LazyColumn {
items(list.size + 1) {
if (it == 0) {
Header()
} else {
DogListItem(list[it - 1])
}
}
}
}
どうするのが良いかというと、素直に Header() と list で item/items を分ければいいんです。items() には数字ではなく List<T> をとる拡張関数が用意されています。
よい例
@Composable
fun DogList(list: List<Dog>) {
LazyColumn {
item { Header() }
items(list) { dog ->
DogListItem(dog)
}
}
}
また、itemsIndexed() を使うと index もとれるので、例えば dog.name の1文字目が変わったら区切りヘッダーを入れるというのもこんな感じで簡単に書けます(list は dog.name で sort されている前提)。
@Composable
fun DogList(list: List<Dog>) {
LazyColumn {
itemsIndexed(list) { index, dog ->
if (index == 0 || list[index - 1].name[0] != dog.name[0]) {
NameDivider(dog.name[0])
}
DogListItem(dog)
}
}
}
0 件のコメント:
コメントを投稿