[Android]最小構成のRecyclerView + DataBinding

少し時間が開くとRecyclerViewの使い方を忘れてしまったので、まとめてみました。
最小限の構成にしています。
（公式のドキュメントは複雑。。。）

## 環境

- Android Studio : 4.1.0
- OS7.0以上

## 前準備

最近のAndroid Studioでは、AndroidXなどデフォルトで有効化されているようなので、いくつかの設定は割愛します。

### Kapt

Kaptの設定を行います。

```app/build.gradle
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions' <- 追加
    id 'kotlin-kapt' <- 追加
}
```
このプラグインを追加するだけです。

### DataBinding

DataBindingを有効化します。

```
android {
  ...

  buildFeatures {
      dataBinding true
  }

}
```

## 実装

## 使用するクラス

- RecyclerView : リスト表示
- LinearLayoutManager : リストのレイアウト方向を管理
- DividerItemDecoration : リストのセパレーター
- RecyclerView.Adapter
- RecyclerView.ViewHolder

## モデル

```User.kt
data class User(val name: String)
```

## １行のレイアウト

```user_row.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android" >

    <data>
        <variable
            name="user"
            type="com.example.databindingsample.User" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="8dp">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user.name}"
            />
    </RelativeLayout>
</layout>

```

ここで、DataBindingのために、`layout`と`data`を使用しています。
`data`として定義している`user`に値をセットすることで、viewが更新されます。

## AdapterとViewHolder

```UserAdapter.kt
//DataBindingを使ってViewHolderを作成
class UserViewHolder(var binding: UserRowBinding) : RecyclerView.ViewHolder(binding.root)

class UserAdapter(private val items: List<User>) : RecyclerView.Adapter<UserViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        val binding: UserRowBinding = DataBindingUtil.inflate(inflater, R.layout.user_row, parent, false)
        return UserViewHolder(binding) //ViewHolderを作成
    }

    override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
        holder.binding.user = items[position] //データをセット
    }

    override fun getItemCount(): Int {
        return items.count()
    }

}
```

## MainActivity

```MainActivity.kt

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var adapter: UserAdapter
    private var users: MutableList<User> = mutableListOf()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        //データを作成
        users.add(User("aaaaaaa"))
        users.add(User("bbbbbbb"))
        users.add(User("ccccccc"))
        users.add(User("ddddddd"))
        users.add(User("eeeeeee"))

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        //set LinearLayoutManager (default: VERTICAL)
        binding.recyclerView.layoutManager = LinearLayoutManager(this)

        //set divider
        val dividerItemDecoration = DividerItemDecoration(this, RecyclerView.VERTICAL)
        dividerItemDecoration.setDrawable(ContextCompat.getDrawable(this, R.drawable.separator)!!)

        //set adapter
        adapter = UserAdapter(users)
        binding.recyclerView.adapter = adapter

    }
}

```

## ソース

https://github.com/usk2000/DataBinding-android

## 参考

https://developer.android.com/jetpack/androidx/releases/databinding
https://developer.android.com/guide/topics/ui/layout/recyclerview?hl=ja
https://b-estack.com/2019/04/18/kotlin_databinding_kapt/
https://developer.android.com/topic/libraries/data-binding/expressions?hl=ja
https://qiita.com/naoi/items/f8a19d6278147e98bbc2