我正在使用RecclerView开发一个Android应用程序,并试图在我的ViewHolder类中直接访问视图ID.根据文件,这似乎是可能的:

"ViewHolder描述了一个项目视图和有关其在回收视图中的位置的元数据.

适配器实现应该子类ViewHolder,并添加用于缓存可能代价高昂的结果的字段."

但是,当try 直接访问这些视图时,我收到错误.相关代码如下:

class AnimalAdapter(val animals: MutableList<Animal>) :
    RecyclerView.Adapter<AnimalAdapter.AnimalViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimalViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.animal_card, parent, false)
        return AnimalViewHolder(view)
    }

    override fun getItemCount(): Int = animals.size

    override fun onBindViewHolder(holder: AnimalViewHolder, position: Int) {
        holder.bind(animals[position])
    }

      inner class AnimalViewHolder(itemView: View) : 
          RecyclerView.ViewHolder(itemView) {
          // Setting direct references (causes errors)
          // itemView.txt_animal_id = 
          itemView.findViewById(R.id.txt_animal_id)
    
          // Using findViewById (works, but seems unnecessary)
          val animalIdTextView: TextView = 
                              itemView.findViewById(R.id.txt_animal_id)
          val calvingDateTextView: TextView = 
                           itemView.findViewById(R.id.txt_calving_date)
           // ... other references ...
    
          fun bind(animal: Animal) {
                // This generates an error
                // itemView.txt_animal_id.text = animal.animalID
        
                // This works, but seems redundant
                animalIdTextView.text = animal.animalID
                // ... other updates ...
          }
     }
}

文档显示,这应该是可行的.导致该错误的原因可能是什么?有没有办法直接访问视图ID,或者更新版本的Android Studio不再支持这一功能?

我感谢任何人的帮助或澄清!

推荐答案

它不支持直接访问,在您引用的文档的这一部分中:

add fields用于缓存可能代价高昂的结果

"添加字段"意味着你必须这么做.它不是自动的.我在您引用的文档中没有看到任何建议自动为您生成字段的内容.

几年前,名为kotlin-android-extensions的扩展支持按名称直接访问视图,该扩展已被弃用,不再适用于最近的Kotlin版本.See this question获取有关这方面的更多信息.

还有另一种方法可以方便地按名称获取视图,称为View Binding,这是推荐的方法.

在您的代码中,根据上面链接的说明在Gradle中启用视图绑定后,您的ViewHolder可能如下所示:

inner class AnimalViewHolder(itemView: View) : 
    RecyclerView.ViewHolder(itemView) {

    private val viewBinding = AnimalCardBinding.bind(itemView)

    fun bind(animal: Animal) = viewBinding.apply {
          // You can directly access views by name in here
    }
}

Android相关问答推荐

如何使用喷气背包压缩让Animated Image Vector每次动画化一条路径?

Android编写动画在发布版本中崩溃

如何在Android Emulator上从物理设备接收TCP消息

如何清除导航抽屉中以前 Select 的项目(Jetpack Compose)

避免在按下肯定按钮时自动取消AlertDialog

Android 14上的慢速意图广播交付

如何在Jetpack Compose中将对象的移动从一个路径平滑地切换到另一个路径?

Android 14预测性背部手势-闪烁的白色背景色

(已解决)从最近的应用程序打开应用程序时出错

Android 不在后台更新位置

如果 auth 失败,如何显示 toast jetpack compose firebase if else @Composable 调用只能在 @Composable 函数的上下文中发生

在移动设备上看到时如何增加 PasswordField 文本?

如何使用 Jetpack Compose 在图像上叠加文本

Android collectAsStateWithLifecycle() 不在可组合内部收集

记住或不记得derivedStateOf

如何在最后一个可见项目之后计算惰性列中的空白空间

在 Jetpack Compose 中找不到 Path 的减号()

Android Jetpack Compose - 找不到 R.drawable?

如何在 Compose 中更改高程 colored颜色 ?

在 android-billing-5.0 中获取 ProductDetails 价格