在 RecyclerViewAdapter 中替换 Kotlin 合成导入
Replacing Kotlin synthetic imports in RecyclerViewAdapter
由于合成导入将在长期 运行 中被弃用,我开始用视图绑定替换它们。到目前为止效果很好,但是在 recyclerview 适配器中构建视图时我遇到了困难。
//other stuff [...]
private lateinit var binding: FinapiBankItemBinding
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): FinApiBankItemViewHolder {
binding = FinapiBankItemBinding.inflate(LayoutInflater.from(parent.context))
return FinApiBankItemViewHolder(binding.root as ConstraintLayout)
}
//more stuff [...]
override fun onBindViewHolder(
holder: FinApiBankItemViewHolder,
position: Int
) {
if (data != null && data.size > position) {
val currentItem = data[position]
buildView(holder.paymentAccountBaseView, currentItem)
}
}
// endregion
// region methods
private fun buildView(view: View, item: FinApiBank) {
//binding.bankNameTextView.text = item.name
//binding.bicTextView.text = item.bic
view.findViewById<TextView>(R.id.bankName_TextView).text = item.name
view.findViewById<TextView>(R.id.bic_TextView).text = item.bic
binding.root.setOnClickListener {
parentViewModel.getAndNavWebform(item.externalId!!)
}
}
在buildView方法中,我注释掉的两行没有按预期工作。视图已正确构建,但不知何故存在令人耳目一新的问题,最后会呈现旧数据(即使进入它并看到正确的值写入字段)。
当使用传统的 findViewById 甚至 viewBinding(这不是一个选项)时,一切都按预期工作。
此 recyclerview 中使用的数据经常交换,因为它显示根据用户输入更新的搜索结果。
您似乎对每一行数据都使用了一个绑定,您的绑定应该在 ViewHolder
中,以便可以在 onBindViewHolder
中访问它。
我建议您查看 Create dynamic lists with RecyclerView 以获得更多关于 ViewHolder
的用途的信息。
你也可以搜索这个RecyclerView with bindings
但是我稍微编辑了你的代码。
尝试这样的事情:
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): FinApiBankItemViewHolder {
binding = FinapiBankItemBinding.inflate(LayoutInflater.from(parent.context),parent,false)
return FinApiBankItemViewHolder(binding)
}
//more stuff [...]
override fun onBindViewHolder(
holder: FinApiBankItemViewHolder,
position: Int
) {
if (data != null && data.size > position) {
val currentItem = data[position]
holder.buildView(holder.binding, currentItem)
}
}
// endregion
// region methods
inner class FinApiBankItemViewHolder(val binding: FinapiBankItemBinding): RecyclerView.ViewHolder(binding.root) {
fun buildView(view: FinapiBankItemBinding, item: FinApiBank) {
binding.bankNameTextView.text = item.name
binding.bicTextView.text = item.bic
binding.root.setOnClickListener {
parentViewModel.getAndNavWebform(item.externalId!!)
}
}
}
由于合成导入将在长期 运行 中被弃用,我开始用视图绑定替换它们。到目前为止效果很好,但是在 recyclerview 适配器中构建视图时我遇到了困难。
//other stuff [...]
private lateinit var binding: FinapiBankItemBinding
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): FinApiBankItemViewHolder {
binding = FinapiBankItemBinding.inflate(LayoutInflater.from(parent.context))
return FinApiBankItemViewHolder(binding.root as ConstraintLayout)
}
//more stuff [...]
override fun onBindViewHolder(
holder: FinApiBankItemViewHolder,
position: Int
) {
if (data != null && data.size > position) {
val currentItem = data[position]
buildView(holder.paymentAccountBaseView, currentItem)
}
}
// endregion
// region methods
private fun buildView(view: View, item: FinApiBank) {
//binding.bankNameTextView.text = item.name
//binding.bicTextView.text = item.bic
view.findViewById<TextView>(R.id.bankName_TextView).text = item.name
view.findViewById<TextView>(R.id.bic_TextView).text = item.bic
binding.root.setOnClickListener {
parentViewModel.getAndNavWebform(item.externalId!!)
}
}
在buildView方法中,我注释掉的两行没有按预期工作。视图已正确构建,但不知何故存在令人耳目一新的问题,最后会呈现旧数据(即使进入它并看到正确的值写入字段)。
当使用传统的 findViewById 甚至 viewBinding(这不是一个选项)时,一切都按预期工作。
此 recyclerview 中使用的数据经常交换,因为它显示根据用户输入更新的搜索结果。
您似乎对每一行数据都使用了一个绑定,您的绑定应该在 ViewHolder
中,以便可以在 onBindViewHolder
中访问它。
我建议您查看 Create dynamic lists with RecyclerView 以获得更多关于 ViewHolder
的用途的信息。
你也可以搜索这个RecyclerView with bindings 但是我稍微编辑了你的代码。
尝试这样的事情:
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): FinApiBankItemViewHolder {
binding = FinapiBankItemBinding.inflate(LayoutInflater.from(parent.context),parent,false)
return FinApiBankItemViewHolder(binding)
}
//more stuff [...]
override fun onBindViewHolder(
holder: FinApiBankItemViewHolder,
position: Int
) {
if (data != null && data.size > position) {
val currentItem = data[position]
holder.buildView(holder.binding, currentItem)
}
}
// endregion
// region methods
inner class FinApiBankItemViewHolder(val binding: FinapiBankItemBinding): RecyclerView.ViewHolder(binding.root) {
fun buildView(view: FinapiBankItemBinding, item: FinApiBank) {
binding.bankNameTextView.text = item.name
binding.bicTextView.text = item.bic
binding.root.setOnClickListener {
parentViewModel.getAndNavWebform(item.externalId!!)
}
}
}