切换Kotlin Synthetics为ViewBinder后如何在Activity修改RecyclerView子项视图
问题原因
- Kotlin Synthetics是通过全局扩展属性给View对象自动注入控件引用,所以之前可以直接调用
itemView.memeCommentsCount,但ViewBinding不会给原生View类添加任何扩展属性,memeCommentsCount是你自定义在ViewHolder类内部的属性,不属于itemView这个View对象的成员。 - 你在Activity中将找到的ViewHolder强制转换成了通用父类
RecyclerView.ViewHolder,父类本身没有定义memeCommentsCount属性,就算不走itemView也无法拿到对应的控件。
解决方法
- 强制类型转换时指定为你自定义的ViewHolder子类(注意替换成你自己Adapter内部定义的ViewHolder类名),直接访问ViewHolder内部的
memeCommentsCount属性即可,不需要通过itemView访问:
// 替换YourAdapter为你自己的RecyclerView适配器类名 val viewHolder = binding.recyclerViewMemes.findViewHolderForAdapterPosition(i) as YourAdapter.ViewHolder viewHolder.memeCommentsCount.text = "●"
- 建议增加空安全处理,避免对应位置没有ViewHolder时出现类型转换异常:
val viewHolder = binding.recyclerViewMemes.findViewHolderForAdapterPosition(i) as? YourAdapter.ViewHolder viewHolder?.memeCommentsCount?.text = "●"
额外提示:如果是数据源变更导致的UI修改,优先修改数据源对应条目的字段,再调用
notifyItemChanged(i)刷新对应位置,比直接修改ViewHolder的View更稳妥,可避免RecyclerView复用ViewHolder时出现显示错乱的问题。
内容的提问来源于stack exchange,提问作者user10651308
相关产品推荐
相关产品推荐

