LoginSignup
1

More than 1 year has passed since last update.

[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)

1行のレイアウト

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のために、layoutdataを使用しています。
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://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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1