我理解Viewholder pattern的想法和用法,但我仍有一个问题:
假设我们在viewholder中有一个TextView,并显示10个项目(“item0,item1 ....”)
如果我打电话给findViewById
一次,据我所知,我有一个TextView的对象。
因此,在第一次调用getView时,我会对视图进行膨胀,找到引用并设置文本“item0”
在第二次调用时,我获得相同的TextView并将文本“item1”设置为相同的TextView
为什么第0项文字不会改变?
背景中是否有任何克隆?
答案 0 :(得分:1)
Is there any cloning in the background?
Android预分配了许多视图,这些视图足以填满运行应用程序的设备屏幕(视图池),从内容角度来看相同但与参考视角不同
答案 1 :(得分:1)
假设您在适配器类中实现了ViewHolder并且在getView()方法中使用了holder,唯一可以肯定的是,在您的情况下,TextView描述了父结构的一个插槽(例如列表显示)。一旦你在xml中定义了从你的适配器充气的插槽,就没有克隆或类似的东西。
根据{{3}},持有人的想法被描述为:
您的代码可能会在滚动期间经常调用findViewById() ListView,可以降低性能。即使是适配器 返回一个膨胀的视图进行回收,你仍然需要查找 元素并更新它们。一种绕过重复使用findViewById()的方法 是使用“视图持有者”设计模式。
ViewHolder对象将每个组件视图存储在标记内 布局的字段,因此您可以立即访问它们而不需要 需要反复查找它们。首先,您需要创建一个类 保持您的确切观点。
没有克隆,只有视图的可重用性