
Copyright © Google
RecyclerViewのViewHolderでバインディングオブジェクトを使う時に警告が出る件
2023/07/18 追記: アホな処理の修正について
RecyclerViewのAdapterでビューバインディングを使いたかったので、ViewHolderの変数にバインディングオブジェクト(って言い方で合ってますか?)を持たせようとしたのですが・・・こういう警告が出る場合がありました
Type argument for a type parameter T can't be inferred because it has incompatible upper bounds: ViewDataBinding, RowExampleBinding (multiple incompatible classes). This will become an error in Kotlin 1.9
型推論がうまくできてない・・・?うーんよくわかんない(ぉ
警告が出た場所は以下
class ExampleAdapter (
val context: Context,
): RecyclerView.Adapter<ExampleAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(context)
val binding = RowExampleBinding.inflate(inflater, parent, false)
return ViewHolder(binding.root)
}
override fun getItemCount(): Int {
...
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val imageView = holder.binding.imageView
...
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding: RowExampleBinding = DataBindingUtil.bind(view)!! // ←ここで警告が出る
}
}
ただこの警告が出ない場合もあって、何でだと思いながら各ファイルを比較してみると、レイアウトファイルの方に原因があるようでした
警告が出る場合のレイアウトファイルはだいたいこのような感じになっていると思います
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/constraintLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
...
</androidx.constraintlayout.widget.ConstraintLayout>
これをルートに<layout>
を追加するよう書き換えます
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
...
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
・・・すると直ります (なんで?)
注意点として、xmlns:fooの形式の属性に関しては、ルート直下にぶら下げるようにして上げてください
本当は細かい理由を探りたいけどちょっと色々と忙しく・・・とりあえず解決方法だけ載っけておくことにしました
大事な追記
ViewHolderの引数をbindingにすればもっとスッキリするじゃーん!
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(context)
val binding = RowExampleBinding.inflate(inflater, parent, false)
return ViewHolder(binding)
}
class ViewHolder(val binding: RowExampleBinding): RecyclerView.ViewHolder(binding.root)