如何让视图绑定与 RecyclerView.ViewHolder 中的 XML 布局高度一起使用,就像他们对 Kotlin Synthetics 所做的那样?

How to get view binding to work with XML layout heights in RecyclerView.ViewHolder like they did with Kotlin Synthetics?

在尝试将应用程序从已失效的 Kotlin 合成方法转换为 newer/supported 视图绑定方法时,我 运行 遇到了布局膨胀但 layout_height 被忽略的问题膨胀的布局。结果是一个看起来不太好的视图。

    inner class InfoAdapter(val data: Array<String>) : androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder>() {
        private val header = 0
        private val item = 1
        private var clickListener: RecyclerClickListener? = null

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder {
            when (viewType) {
                item -> return ItemVH(StringRowBinding.inflate(layoutInflater))
                header -> return HeaderVH(InfoHeaderBinding.inflate(layoutInflater))
            }

            return ItemVH(StringRowBinding.inflate(layoutInflater))
        }

...

        inner class ItemVH(private val binding: StringRowBinding): androidx.recyclerview.widget.RecyclerView.ViewHolder(binding.root) {
            init {
                itemView.setOnClickListener { v ->
                    clickListener?.itemClicked(v, adapterPosition)
                }
            }
            fun bind(text: String) {
                binding.title.text = text
            }
        }

...
    }

string_row.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:background="?android:attr/selectableItemBackground">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="16dp"
        android:layout_marginStart="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginEnd="16dp"
        android:textAppearance="@style/TextAppearance.AppCompat.Body2"/>

</RelativeLayout>

相对布局的高度应该是 48dp,但似乎该属性被忽略了。数据确实显示并且布局高度属性与 Kotlin 合成器配合得很好。

我找到了 但没有特定于 ViewHolder + 视图绑定的内容。与该问题的公认答案相关的是修辞问题:使用 Google 推荐的 XYZBinding.inflater() 视图绑定方法来摆脱 findViewById() 调用有什么意义,如果它只是要忽略膨胀布局的边距、高度和宽度,“修复”基本上是根本不使用 inflater() 调用而只使用 findViewById()?也就是说,已接受的答案大多破坏了使用视图活页夹膨胀视图的目的并重新引入 findViewById()。无论如何,如何使特定答案适应这种情况并不明显。

问题是您正在使用未指定父视图的 inflate() 的重载。执行此操作时,根视图上的任何 layout_ 属性都将被忽略(并被默认值替换)。试试这个:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder {
    when (viewType) {
        item -> return ItemVH(StringRowBinding.inflate(layoutInflater, parent, false))
        header -> return HeaderVH(InfoHeaderBinding.inflate(layoutInflater, parent, false))
    }

    return ItemVH(StringRowBinding.inflate(layoutInflater, parent, false))
}

确保将 false 作为第三个参数传递; RecyclerView 本身将管理将子视图附加到父视图。