Android:使用View的setTag()属性时应该注意什么?

时间:2009-10-13 16:06:44

标签: android views

因为Java使用对象引用而不是对象本身,是什么阻止我使用setTag()用整个对象而不是对象的属性标记视图?它只是在getTag()调用之后尝试解析其中一个属性时的属性查找时间,还是我应该关注其他任何特定的事情?

至于我的具体问题,我使用的是具有imageview和textview的自定义列表视图。最初我将listview绑定到自定义适配器以获取一些xml数据,然后在每个项目的xml中使用某些标记来填充我的listview。所以我所指的“整个对象”是项目的整个XML的解析版本......

3 个答案:

答案 0 :(得分:4)

setTag(Object)方法最受欢迎的用途之一是准确保留对类实例的引用 - 如果您使用了自定义ListView和自定义Adapter,则应该了解ViewHolder模式。

我不知道你的具体问题,我会说 - 这有时会危险吗?是的,如果不负责任地使用。这是否意味着你应该不惜一切代价避免它?不,绝对没有。

修改:为什么要将视图的已解析数据绑定到它们?

你真的需要它,或者你可以填充某种类型的模型?如果你想在上下文中访问视图的标记,你的视图中没有相同的含义/位置(比如我们最喜欢的ViewHolder示例中的convertView :),我认为使用标签是行。

否则,我相信如果你多考虑一下,你会发现另一种更适合你问题的方法。

答案 1 :(得分:1)

settag有两个api,只有一个值,另一个有key和value。第一个api非常安全,但在使用第二个api时你需要非常小心。

在View.java内部,Android将静态hashmap映射视图维护为稀疏数组。 settag中传递的键和值存储在稀疏数组中。有两件重要的事情需要考虑。

首先不保存对活动有任何引用的值对象。这将导致内存泄漏,因为活动将具有来自值的强引用,并且值具有来自View.class维护的静态散列映射的强引用。

其次,每次查找gettag都需要查找散列映射和稀疏数组。哪个效率不高。

由于 素里亚。

答案 2 :(得分:0)

注意避免以下情况:

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

  • 某些库或其他机制将该标签用作“伎俩”,与您的使用不符。