とある発表資料で見かけたのですが、LazyColumn (LazyRow)ではこういう index で頑張る方法は必要ありません。
RecyclerView がこういう頑張りをしないといけなかったので、こうやってしまう気持ちはわかります。
よくない例
- @Composable
- fun DogList(list: List<Dog>) {
- LazyColumn {
- items(list.size + 1) {
- if (it == 0) {
- Header()
- } else {
- DogListItem(list[it - 1])
- }
- }
- }
- }
@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)
- }
- }
- }
@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)
- }
- }
- }
@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 件のコメント:
コメントを投稿