Android Kotlin viewBinder - 从 Activity 更改 RecyclerView Item 的 ItemView

Posted

技术标签:

【中文标题】Android Kotlin viewBinder - 从 Activity 更改 RecyclerView Item 的 ItemView【英文标题】:Android Kotlin viewBinder - change ItemView of RecyclerView Item from Activity 【发布时间】:2021-11-19 19:30:24 【问题描述】:

从 Kotlin Synthetics 切换到 viewBinder 后,我无法从活动中更改 RecyclerView 项目的 itemView。

这是内部活动:

val viewHolder = binding.recyclerViewMemes.findViewHolderForAdapterPosition(i) as RecyclerView.ViewHolder
viewHolder.itemView.memeCommentsCount.text = "\u25CF"

我在memeCommentsCount 上收到unresolved reference

这是Recyclerview里面的ViewHolder

class ViewHolder(itemView: MemeViewBinding?) : RecyclerView.ViewHolder(itemView!!.root)
    val memeCommentsCount = itemView!!.memeCommentsCount

【问题讨论】:

如果我无法使用 viewBinder @a_local_nobody 完全做到这一点,我会这样做 如果您的 Activity 必须进入适配器来修改单个 ViewHolder 实例,那么您的整体设计就有问题。 Activity 应该为后备列表中的各个项目提供更改,并通知适配器该位置的项目已更改。当活动在适配器上调用notifyItemChanged() 时,适配器将为该项目调用自己的onBindViewHolder(),因此视图将在那里相应地更新。在我看来,findViewHolderFor... 函数的任何使用都是代码异味。 你这样做的方式,如果当前项目不在屏幕上,则不会发生变化,然后滚动到屏幕上就会出错。并且在您的 ViewHolder 类中提供了一个提示……itemView 没有理由可以为空。您将其视为无论如何都不可为空,因为您在其上使用了!!。使用!! 也几乎总是一种代码味道。 好吧,我让它不能为空,真的没有必要再用可空的了!! xD 谢谢! 【参考方案1】:

看起来您有自己的 ViewHolder 实现,但正在将变量转换为没有 memeCommentsCount 的默认实现。

尝试使用as ViewHolder 而不是as RecyclerView.ViewHolder,并确保您导入的是ViewHolder 类而不是默认类

或者将您的 ViewHolder 重命名为 MemeViewHolder 之类的其他名称,并将您的 viewHolder 变量转换为该名称

此外,当您将其设置为视图持有者本身的变量时,您正试图将其从视图持有者的 itemView 中移除,因此该行需要更改

viewHolder.itemView.memeCommentsCount.text = "\u25CF"

viewHolder.memeCommentsCount.text = "\u25CF"

【讨论】:

我试过了,它自动从 ViewHolder 更改为 MemesAdapter.ViewHolder 但我仍然对 memeCommentsCount 有未解决的引用 @EduardUnruh 为我的答案添加了更新 是的,现在可以了。我不需要重命名 ViewHolder,因为我还是导入了我的自定义,使用 viewHolder.memeCommentsCount.text 而不是 viewHolder.itemView.memeCommentsCount.text 唯一仍然缺少的东西。谢谢!!

以上是关于Android Kotlin viewBinder - 从 Activity 更改 RecyclerView Item 的 ItemView的主要内容,如果未能解决你的问题,请参考以下文章

android ViewBinding

Android Kotlin - viewBinding 在视图上导入未解析的引用

Android Jectpack-ViewBinding 实践(kotlin实现)

Android Kotlin - viewBinding 类型不匹配:推断类型为 DrawerLayout 但应为 ConstraintLayout

Android Kotlin viewBinder - 从 Activity 更改 RecyclerView Item 的 ItemView

Android开发:关于Databinding与Viewbinding以及kotlin-android-extensions