Jetpack Composeでシンプルなリストビューを表示してみる

# 初めに
近年、Android界隈ではJetpack Composeがもっぱらの話題ですね。
勉強会などのテーマにも頻出しています。
乗り遅れないよう、今日はJetpac Composeを使ったリストビューの表示をしていきたいと思います。

# 前提
下準備として、チュートリアルを ~~コピペ~~参考に、リスト要素の実装をしておきます。
コードとしてはこんな感じですね。
```kotlin
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MessageCard(Message("Android", "Jetpack Compose"))
        }
    }
}

data class Message(val author: String, val body: String)

@Composable
fun MessageCard(msg: Message) {
    Row(modifier = Modifier.padding(all = 8.dp)) {
        Image(
            painter = painterResource(R.drawable.ic_banana),
            contentDescription = "Contact profile picture",
            modifier = Modifier
                .size(40.dp)
                .clip(CircleShape)
        )
        Spacer(modifier = Modifier.width(8.dp))

        Column {
            Text(text = msg.author)
            Spacer(modifier = Modifier.height(4.dp))
            Text(text = msg.body)
        }

    }

}
```
見た目としてはこんな感じになってます。
<img width="300" alt="Screenshot_1648080971.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466399/19367aca-2f3c-9398-88df-929cdd098ab9.png">

# リスト表示してみる
Composeでリスト表示する際は、`LazyColumn`または`LazyRow`というコンポーネントを使います。
名前の通り、`LazyColumn`は縦方向に、`LazyRow`は横方向にスクロールするリストを生成します。
`LazyColumn`メソッドの中身を見ていくと下記のようになっており、要素感のpaddingを調整したり、stateを使ってスクロール状態の検知などができるそうです。
```kotlin:LazyDls.kt
@Composable
fun LazyColumn(
    modifier: Modifier = Modifier,
    state: LazyListState = rememberLazyListState(),
    contentPadding: PaddingValues = PaddingValues(0.dp),
    reverseLayout: Boolean = false,
    verticalArrangement: Arrangement.Vertical =
        if (!reverseLayout) Arrangement.Top else Arrangement.Bottom,
    horizontalAlignment: Alignment.Horizontal = Alignment.Start,
    flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
    content: LazyListScope.() -> Unit
)
```

それでは、上記の要素をリスト表示させてみます。
今回は縦方向に並べていきたいので、LazyColumnを使用します。
なんとこれだけです。
```kotlin
@Composable
fun MessageList() {
    LazyColumn{
        item {
            MessageCard(Message("android", "first message"))
        }
        item {
            MessageCard(Message("android", "second message"))
        }
        item {
            MessageCard(Message("android", "third message"))
        }
    }
}
```
上記のメソッドを呼ぶだけで、次のようにリスト表示させてくれます。
<img width="300" alt="Screenshot_1648080971.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466399/a34de6b9-7e25-30d9-c5cc-4d98ee045341.png">

次のように、コレクション要素を追加できる拡張関数も用意されているようです。
実際の開発ではこちらを使うことになるでしょう。
```kotlin
@Composable
fun MessageList(messages: List<Message>) {
    LazyColumn {
        items(messages) { message ->
            MessageCard(msg = message)
        }
    }
}
```

# 終わりに
従来の方法だと、簡単なリスト表示をするにもAdapterクラスを作ってアイテムのViewHolderを作ってそれをRecyclerViewにセットして~~とやることが多かったですが、Jetpack Composeを使用することでコード量や手間がかなり削減されることがわかりました。Composeがここまで話題になっている理由が少しわかった気がしますね。

# おまけ ~クリックイベントを設定してみる~
思っていたより簡潔にできたため、おまけとしてクリックイベントの設定をしてみます。
アイテム要素側のModifierにイベントを設定するだけでした。
Composeableメソッド内でContextを取得するには`LocalContext`クラスを使用するのですね
```kotlin
@Composable
fun MessageCard(msg: Message) {
    val context = LocalContext.current
    Row(modifier = Modifier
        .clickable {
            Toast.makeText(context, msg.body, Toast.LENGTH_SHORT).show()
        }
    ) {
        // 省略
    }
}
```
<img width="300" alt="Screenshot_1648080971.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466399/d9573ab5-f162-aeb6-c4fa-4c391af5e690.png">