Android: 当使用 View 的 setTag() 属性时,我需要注意哪些问题?

4
因为Java使用对象引用而不是对象本身,所以我可以使用setTag()将整个对象标记到视图上,而不是对象的属性。那么问题在于,当尝试解析getTag()调用之后的一个属性时,会出现属性查找时间,还是有其他特定的事情需要关注?
至于我的具体问题,我正在使用自定义的ListView,其中包含一个ImageView和一个TextView。最初,我将ListView绑定到自定义适配器以获取一些XML数据,然后在每个项目的XML中使用某些标记来填充我的ListView。因此,我提到的“整个对象”是项目的整个XML的解析版本...
3个回答

4
setTag(Object)方法最常用的用途之一是保留对类实例的引用 - 如果您使用自定义ListView和自定义Adapter,那么您应该知道ViewHolder模式。
不了解您特定问题的情况下,我会说 - 这有时候是危险的吗?是的,如果不负责任地使用。这是否意味着您应该不惜一切代价避免使用它?不,绝对不。 编辑:为什么你要把解析后的数据绑定到视图上?
您真的需要吗,或者您可以填充某种类型的模型?如果您想在视图不携带相同含义/位置(如在我们喜爱的ViewHolder示例中的convertView)的上下文中访问视图的标记,则我认为使用标记是可以的。
否则,我相信如果您再多考虑一下,就能找到另一种更适合您的问题的方法。

是的,我听说过ViewHolder模式。谢谢...这让我感到宽慰...关于我的问题,我刚刚更新了上面的问题... - Legend
它只是因为项目描述根据查看的项目而变化。因此,如果我必须将一些信息传递给一个意图,我需要一些有关这个特定项目的额外信息。当然,我认为说我会传递整个项目有些夸张,只需要一个或两个属性对我来说就足够了。但是,我只是想从性能的角度了解一下...感谢回复... - Legend

1

有两个api可以用于settag,一个只有值,另一个有键和值。第一个api非常安全,但使用第二个api时需要非常小心。

在View.java内部,Android维护一个静态哈希映射视图到稀疏数组。传递给settag的键和值存储在稀疏数组上。需要考虑两个重要事项。

首先,不要保存具有对活动任何引用的值对象。这将导致内存泄漏,因为活动将从值中获得强引用,并且值从View.class维护的静态哈希映射中获得强引用。

其次,每次查找gettag都必须在哈希映射和稀疏数组中进行查找。这不是非常有效率的。

谢谢 Suriya。


0

请注意避免以下情况:

  • 视图正在被回收,因此标签的现有内容可能不适合视图的新用例。

  • 某些库或其他机制将标签用作“技巧”,这与您的使用方式不兼容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接