1

我了解Viewholder 模式的想法和用法,但我仍然有一个问题:
假设我们在 viewholder 中有一个 TextView,并且要显示 10 个项目(“item0,item1 ....”)。
如果我打电话findViewById一次,据我所知,我有一个 TextView 的对象。因此,在第一次调用 getView 时,我会放大视图,找到参考并设置文本“item0”。
在第二次通话中,我得到相同的 TextView 并将文本“item1”设置为相同的 TextView。
为什么第 0 项文本不会改变?
后台有克隆吗?

4

2 回答 2

1
Is there any cloning in the background?

Android 预先分配了一些足以填满运行应用程序的设备屏幕的视图(视图池),从内容角度来看是相同的,但从参考角度来看是不同的

于 2014-10-20T12:08:17.790 回答
1

假设您在适配器类中实现 ViewHolder 并在 getView() 方法中使用持有者,唯一可以肯定的是,您的案例中的 TextView 描述了父结构的插槽(例如 ListView)。一旦您在 xml 中定义了从您的适配器膨胀的插槽,就没有克隆或类似的东西。
根据谷歌文档,持有人的想法被描述为:

您的代码可能会在 ListView 滚动期间频繁调用 findViewById(),这会降低性能。即使适配器返回一个膨胀的视图进行回收,您仍然需要查找元素并更新它们。重复使用 findViewById() 的一种方法是使用“视图持有者”设计模式。

ViewHolder 对象将每个组件视图存储在 Layout 的 tag 字段中,因此您可以立即访问它们而无需重复查找它们。首先,您需要创建一个类来保存您的确切视图集。

没有克隆,只有视图的可重用性

于 2014-10-20T12:26:58.753 回答