检索所有具有相同ID的视图

时间:2019-06-14 13:26:40

标签: android

假设我有一个RecyclerView,其中ViewHolder绑定了一个包含View并带有ID的布局。

设计

*RecyclerView
**ViewHolder0
***TextView with ID myTitle
**ViewHolder1
***TextView with ID myTitle
**ViewHolder2
***TextView with ID myTitle
**ViewHolder3
***TextView with ID myTitle

如果同时加载了这些视图,那么屏幕资源足以显示所有ViewHolder ,如何获取ID为myTitle的所有视图? >

我尝试了基本的findViewById(int ResourceID),但是它只给我第一个TextView,并且只有当第一个String jsonValue="[{\"name\": \"Kadam\", \"active\": true}]"; 从屏幕上消失并且可能从中删除时,我才知道第二个。

注意:我不是自己创建视图树,而是必须与之交互。

2 个答案:

答案 0 :(得分:1)

我制作了一个示例应用程序来比较findViewHolderForAdapterPositionfindViewHolderForLayoutPositionLayoutManager的{​​{1}}函数。

TL; DR :您可以使用getChildAt,因为您的视图肯定适合屏幕,并且只要布局更改不多即可。索引将与适配器的索引匹配,因此最上面的是findViewHolderForAdapterPosition


我进行的活动有一个RecyclerView和一个按钮,当单击该按钮时,会将文本记录在ID为0(布局为text1)的文本视图中。由于它们的所有ID都相同,因此应该符合您的要求。适配器有20个字符串,从“项目0”到“项目19”。

现在请注意,如果视图未显示在屏幕上,则android.R.layout.simple_list_item_1ForLayoutPosition都将返回ForAdapterPositionnull文档中提到的两者之间的区别在于

  

ForAdapterPosition不同,此方法考虑了可能尚未反映到布局的任何挂起的适配器更改。另一方面,如果调用了findViewHolderForLayoutPosition(int),但尚未计算出新的布局,则该方法将返回null,因为在重新计算布局之前,新的视图位置是未知的。

因此,仅当项目顺序发生变化时,两者的收益率才不同。它可能是交换,删除或添加。需要进行布局更改的任何内容都会导致两者发生分歧,直到发生布局更改为止。之后,它们再次返回相同的值。

另一方面,notifyDataSetChanged()不知道适配器。因此,它的位置完全基于布局。

要通过示例进行演示,请说第6至16项在我的屏幕上可见,如下所示。这些框是布局范围,我将其设置为可见。

(请注意,在这种情况下,第17个视图尚未加载,但由于第6项可能会向上滚动,因此它可能会被加载到布局中,而第6项是部分可见的)

Screenshot of RecylerView

在按钮的LayoutManager中,我将所有索引onClick-0的值记录在一个for循环中(忽略按钮文本如何显示“第一项”)。 19ForAdapterPosition的结果都是屏幕外返回{{1}的索引ForLayoutPosition0517 }},而19null返回实际的ViewHolder对象。从中,您可以强制转换为自定义ViewHolder类并获取所需的View,也可以执行6

同时,16返回holder.itemView.findViewById()而不是LayoutManager.getChildAt。它认为View是屏幕上的第一项,即ViewHoldergetChildAt(0)映射到"Item 6"。对于索引"Item 16"getChildAt(10),它返回11

因此,尽管两者都设法在屏幕上获得11个可见视图,但我认为最好使用19,因为它在大多数情况下都将与适配器中项目的位置匹配。

答案 1 :(得分:0)

您可以检查持有人的每个视图,并在每个视图上使用index.html,就像您将获得属于回收站内部每个视图的每个textViews。

app.js