在数据 ViewHolder 中获取绑定

Get binding in data ViewHolder

这是我当前的 ViewHolder 代码,我想对其进行修改以允许我通过绑定变量访问元素:

class MenuViewHolder(
    parent: ViewGroup,
    private val onClick: (BaselineLink) -> Unit
) : RecyclerView.ViewHolder(
    LayoutInflater.from(parent.context)
        .inflate(R.layout.list_item_menu, parent, false)
) {

    private val textTitle: AppCompatTextView = itemView.findViewById(R.id.text_title)

最后一行我想要的结果是

private val textTitle: AppCompatTextView = binding.textTitle

我知道我需要修改行:

LayoutInflater.from(parent.context).inflate(R.layout.list_item_menu, parent, false)

但是如果我把它改成

val inflater = LayoutInflater.from(parent.context)
val binding = PromotionItemBinding.inflate(inflater)

没用。

您不能在 super-constructor 调用中声明属性。

有以下三种方法:

  1. 在主构造函数中声明您的绑定 属性,这样您就可以将绑定的根视图传递给超级构造函数。您必须在 class:
  2. 之外膨胀绑定
class MenuViewHolder(
    val binding: ListItemMenuBinding,
    private val onClick: (BaselineLink) -> Unit
) : RecyclerView.ViewHolder(binding.root) {

    private val textTitle: AppCompatTextView = binding.textTitle
}

// In onCreateViewHolder:
return MenuViewHolder(ListItemMenuBinding.inflate(LayoutInflator.from(parent), parent, false) {
    // your click listener
}
  1. 这类似于 1,但要保留它 self-contained,您需要添加一个执行 inflation 的辅助构造函数。所以,你还需要一个辅助构造函数,这样你就可以使用你的父参数来确定绑定:
class MenuViewHolder private constructor(
    val binding: ListItemMenuBinding,
    private val onClick: (BaselineLink) -> Unit
) : RecyclerView.ViewHolder(binding.root) {

    constructor(
        parent: ViewGroup,
        onClick: (BaselineLink) -> Unit
    ): this(
            ListItemMenuBinding.inflate(LayoutInflater.from(parent.context), parent, false),
            onClick
        )

    private val textTitle: AppCompatTextView = binding.textTitle
}
  1. 保留您现有的 inflation 方法,并将您的绑定声明为 属性,其中您 bind 将其绑定到您已经膨胀的现有实例:
class MenuViewHolder(
    parent: ViewGroup,
    private val onClick: (BaselineLink) -> Unit
) : RecyclerView.ViewHolder(
    LayoutInflater.from(parent.context)
        .inflate(R.layout.list_item_menu, parent, false)
) {
   
    private val binding = ListItemMenuBinding.bind(itemView)
    private val textTitle: AppCompatTextView = binding.textTitle

}