如何在通过适配器为每个元素设置自定义id后在RecyclerView中查找viewbyid



我有一个片段,实现回收器视图与开关。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

查看更多选项如果这些不是你所要求的,请告诉我

相关内容

  • 没有找到相关文章

最新更新