2021年5月2日日曜日

LazyColumn (LazyRow) の item 指定は index で頑張らなくていい

とある発表資料で見かけたのですが、LazyColumn (LazyRow)ではこういう index で頑張る方法は必要ありません。
RecyclerView がこういう頑張りをしないといけなかったので、こうやってしまう気持ちはわかります。

よくない例
  1. @Composable  
  2. fun DogList(list: List<Dog>) {  
  3.     LazyColumn {  
  4.         items(list.size + 1) {  
  5.             if (it == 0) {  
  6.                 Header()  
  7.             } else {  
  8.                 DogListItem(list[it - 1])  
  9.             }  
  10.         }  
  11.     }  
  12. }  


どうするのが良いかというと、素直に Header() と list で item/items を分ければいいんです。items() には数字ではなく List<T> をとる拡張関数が用意されています。

よい例
  1. @Composable  
  2. fun DogList(list: List<Dog>) {  
  3.     LazyColumn {  
  4.         item { Header() }  
  5.         items(list) { dog ->  
  6.             DogListItem(dog)  
  7.         }  
  8.     }  
  9. }  
また、itemsIndexed() を使うと index もとれるので、例えば dog.name の1文字目が変わったら区切りヘッダーを入れるというのもこんな感じで簡単に書けます(list は dog.name で sort されている前提)。
  1. @Composable  
  2. fun DogList(list: List<Dog>) {  
  3.     LazyColumn {  
  4.         itemsIndexed(list) { index, dog ->  
  5.             if (index == 0 || list[index - 1].name[0] != dog.name[0]) {  
  6.                 NameDivider(dog.name[0])  
  7.             }  
  8.             DogListItem(dog)  
  9.         }  
  10.     }  
  11. }  




0 件のコメント:

コメントを投稿