在数据 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 调用中声明属性。
有以下三种方法:
- 在主构造函数中声明您的绑定 属性,这样您就可以将绑定的根视图传递给超级构造函数。您必须在 class:
之外膨胀绑定
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,但要保留它 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
}
- 保留您现有的 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
}
这是我当前的 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 调用中声明属性。
有以下三种方法:
- 在主构造函数中声明您的绑定 属性,这样您就可以将绑定的根视图传递给超级构造函数。您必须在 class: 之外膨胀绑定
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,但要保留它 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
}
- 保留您现有的 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
}