LoginSignup
1
1

More than 3 years have passed since last update.

[Android]最小構成のRecyclerView + DataBinding

Posted at

少し時間が開くと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

1
1
0

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
  3. You can use dark theme
What you can do with signing up
1
1