在 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!!)
    }
}
}