Jetpack ComposeでListViewっぽいの作ってみた

※「Android Studio 4.0 Canary 4」にて開発
#はじめに
[[CA Tech Dojo/Challenge/JOB Advent Calendar 2019]](https://qiita.com/advent-calendar/2019/dojo-challenge-job)も始まって今日でいよいよ1週間です．そして1週間目の今日は私が担当させていただきます．

僕はCA Tech Dojo-Androidアプリ(Kotlin)編-に参加させていただきました．前の方々も書いている通りとても成長を実感できるインターンでした！

#Jetpack Composeとは
Google I/O 2019で発表された，UIを構築するための宣言型のツールキットです．簡単に言ってしまえば，今まではxmlファイルでUIをいじって，Kotlinファイルで処理を書いて，とやっていましたが，`Jetpack Compose`を使えば，KotlinファイルでUIから処理まで全部できちゃうっていう感じになります．

##Hello World!の表示

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Greeting("World")
        }
    }
}

@Composable
fun Greeting(name: String) {
   Center {
       Text(text = "Hello $name!",
           style = TextStyle(
               color = androidx.ui.graphics.Color.Red,
               fontSize = 24.sp
           )
       )
   }
}
```
まずはじめに，`@Composable`アノテーションをつけた関数を作成し，その中でテキストの配置やスタイル(色やフォントサイズ)を決める処理を書いています．`Center`の中に`Text`を配置することで，画面中央への表示を可能にし，`TextStyle`で色やフォントの指定をしています．
次に`onCreate`内に`setContent`を呼び，その中で先ほど作成した関数を呼び出しています．
たったこれだけで，画面の中央にフォントサイズ24spで真っ赤っかの`Hello World!`を表示することができます．

☟こんな感じ☟
<img width="250" alt="hello.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495465/0a394354-09a2-010f-3342-0af16b7ff5ac.png">

##List表示
現時点で`Jetpack Compose`には，**`ListView`や`RecyclerView`に相当するコンポーネントはない**そうです．そのため今回は，`VerticalSclloer`と`Column`による`ListView`の実装をしたいと思います．

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            CreateList()
        }
    }
}

@Composable
fun CreateList() {
    MaterialTheme {
        VerticalScroller {
            Column {
                (0..20).map {
                    ListItem(
                       text = it.toString(), 
                       onClick = { /*クリック時の処理*/ }
                    )
                    Divider(
                       color = androidx.ui.graphics.Color.Blue
                    )
                    HeightSpacer(
                       height = 6.dp
                    )
                }
            }
        }
    }
}
```
`VerticalScroller`で画面のスクロールを可能にしています．
`Column`で20個の要素を縦並びに表示し，リストを作成しています．`ListItem`では各要素のテキストを指定したり，クリック時の処理を書くことができます．`Divider`では各要素の区切り線を表示しており，ここでは区切り線の色を青に指定しています．`HeightSpacer`では各要素のスペースを指定しています．
このように`VerticalScroller`と`Column`を組み合わせることで，`ListView`を作成することができます．

☟こんな感じ☟
<img width="250" alt="jetpack.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495465/e3eacb26-e076-7065-6e41-31afc2177c55.png">

#最後に
今年発表された`Jetpack Compose`．「名前は聞いたことあったけど，どんな感じなんやろ？」と気になったので，軽くですが触ってみました．
今回は`Jetpack Compose`で`Hello World!`の表示と`ListView`を作成しましたが，ちょうど最近参加したAndroid勉強会でこの話を聞き，そちらを参考にさせていただきました．他にも，パラメータの変更によるUIの再描画は`@Model`アノテーションを付与しなければいけなかったりと，学ぶべきことがたくさんあります．まだまだ分からないことだらけなので，これからもどんどん新しい技術に挑戦しキャッチアップしていきたいです．

#参考文献
[1][https://developer.android.com/jetpack/compose?hl=ja](https://developer.android.com/jetpack/compose?hl=ja)
[2][https://codelabs.developers.google.com/codelabs/jetpack-compose-basics/#0](https://codelabs.developers.google.com/codelabs/jetpack-compose-basics/#0)
[3][https://speakerdeck.com/charcojp/about-jetpack-compose](https://speakerdeck.com/charcojp/about-jetpack-compose)
[4][https://qiita.com/ovama-koffee/items/3ab389f41285c077252e](https://qiita.com/ovama-koffee/items/3ab389f41285c077252e)
[5][https://qiita.com/kota_2402/items/7bbdd87be8024785e25b](https://qiita.com/kota_2402/items/7bbdd87be8024785e25b)