我有一个片段,实现回收器视图与开关。RecyclerView以id+=1的方式为每个开关设置id。问题是,一旦调用抛出NullableException,我就无法从这些id中获得任何信息。我知道我必须正确地从parent调用它,但我不知道如何正确地调用它。这是代码的结构:Fragment with ConstraintLayout(R.id.settingsScreen) ->RecylerView(R.id.recyclerView),它创建了带有开关(R.id.switch)的LinearLayouts(R.id.settingLayout)。
class ViewHolder{
val l : LinearLayout = view.findViewById(R.id.settingLayout)
}
if (holder.l.findViewById<SwitchCompat>(1100).isActivated){..}
抛出java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.appcompat.widget.SwitchCompat.isActivated()' on a null object reference
这样自己创建视图id是非常脆弱的。它们很容易与Android版本生成的id发生冲突。因此,如果您创建id,您应该使用ViewCompat.generateViewId()
来安全地完成。
但是findViewById
通常是你首先要避免的东西。它是缓慢的。这就是为什么要提供视图绑定,来缓存视图,这样你就不必一直搜索它们了。
我强烈建议将视图存储在集合中,而不是为它们分配id。然后,当您需要它们时,您可以有效地从集合中取出它们。您只需要确保在处理完视图后收集将被垃圾收集(不要创建一个比视图所在屏幕更长寿的收集)。
您可以使用itemView属性
获取视图当你说自定义id时,不确定你在做什么。
你可以用itemView获得viewHolder填充的所有视图
这个属性在ViewHolder的构造函数中将view作为参数传递给ViewHolder后,ViewHolder会根据视图的id来膨胀视图。
你可以在ViewHolder中获取view:
itemView.findViewById<LinearLayout>(R.id.settingLayout)
itemView.findViewById<SwitchCompat>(R.id.switch)
你可以在google docs
查看更多选项如果这些不是你所要求的,请告诉我