假设我有一个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}]";
从屏幕上消失并且可能从树中删除时,我才知道第二个。
注意:我不是自己创建视图树,而是必须与之交互。
答案 0 :(得分:1)
我制作了一个示例应用程序来比较findViewHolderForAdapterPosition
,findViewHolderForLayoutPosition
和LayoutManager
的{{1}}函数。
TL; DR :您可以使用getChildAt
,因为您的视图肯定适合屏幕,并且只要布局更改不多即可。索引将与适配器的索引匹配,因此最上面的是findViewHolderForAdapterPosition
。
我进行的活动有一个RecyclerView和一个按钮,当单击该按钮时,会将文本记录在ID为0
(布局为text1
)的文本视图中。由于它们的所有ID都相同,因此应该符合您的要求。适配器有20个字符串,从“项目0”到“项目19”。
现在请注意,如果视图未显示在屏幕上,则android.R.layout.simple_list_item_1
和ForLayoutPosition
都将返回ForAdapterPosition
。 null
文档中提到的两者之间的区别在于
与
ForAdapterPosition
不同,此方法考虑了可能尚未反映到布局的任何挂起的适配器更改。另一方面,如果调用了findViewHolderForLayoutPosition(int)
,但尚未计算出新的布局,则该方法将返回null,因为在重新计算布局之前,新的视图位置是未知的。
因此,仅当项目顺序发生变化时,两者的收益率才不同。它可能是交换,删除或添加。需要进行布局更改的任何内容都会导致两者发生分歧,直到发生布局更改为止。之后,它们再次返回相同的值。
另一方面,notifyDataSetChanged()
不知道适配器。因此,它的位置完全基于布局。
要通过示例进行演示,请说第6至16项在我的屏幕上可见,如下所示。这些框是布局范围,我将其设置为可见。
(请注意,在这种情况下,第17个视图尚未加载,但由于第6项可能会向上滚动,因此它可能会被加载到布局中,而第6项是部分可见的)
在按钮的LayoutManager
中,我将所有索引onClick
-0
的值记录在一个for循环中(忽略按钮文本如何显示“第一项”)。 19
和ForAdapterPosition
的结果都是屏幕外返回{{1}的索引ForLayoutPosition
到0
和5
到17
}},而19
至null
返回实际的ViewHolder对象。从中,您可以强制转换为自定义ViewHolder类并获取所需的View,也可以执行6
。
同时,16
返回holder.itemView.findViewById()
而不是LayoutManager.getChildAt
。它认为View
是屏幕上的第一项,即ViewHolder
和getChildAt(0)
映射到"Item 6"
。对于索引"Item 16"
至getChildAt(10)
,它返回11
。
因此,尽管两者都设法在屏幕上获得11个可见视图,但我认为最好使用19
,因为它在大多数情况下都将与适配器中项目的位置匹配。
答案 1 :(得分:0)
您可以检查持有人的每个视图,并在每个视图上使用index.html
,就像您将获得属于回收站内部每个视图的每个textViews。
app.js