少し時間が開くとRecyclerViewの使い方を忘れてしまったので、まとめてみました。
最小限の構成にしています。
(公式のドキュメントは複雑。。。)
環境
- Android Studio : 4.1.0
- OS7.0以上
前準備
最近のAndroid Studioでは、AndroidXなどデフォルトで有効化されているようなので、いくつかの設定は割愛します。
Kapt
Kaptの設定を行います。
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
モデル
data class User(val name: String)
1行のレイアウト
<?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
//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
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