2009-10-13 76 views
4

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

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

回答

4

setTag(Object)方法的一个最受欢迎的用法是正确地保留对类实例的引用 - 如果你已经使用定制ListView和定制Adapter,您应该了解ViewHolder模式。

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

编辑:为什么你想要为你的视图绑定到他们的解析数据?

您是否真的需要它,或者您可以填充某种类型的模型?如果你想在上下文中访问视图的标签,那么你的视图不具有相同的含义/位置(比如convertView在我们最喜欢的ViewHolder示例:)),我会认为使用标签是可以的。否则,我相信如果你多给一点思考,你会发现另一种更适合你的问题的方法。

+0

是的。我听说过ViewHolder模式。谢谢...这是一种解脱... 关于我的问题,我刚才更新了我的问题以上... – Legend 2009-10-13 17:08:49

+0

它只是项目说明不断变化,取决于哪个项目正在查看。所以如果我必须传递一些信息到意图,我需要关于这个特定项目的额外信息。当然,我认为我夸大说我会通过整个项目,但只有一个或两个属性对我来说很好。但是,我想从性能的角度来看......感谢您的回复...... – Legend 2009-10-13 23:38:30

1

有两个api用于settag one,其中只有value,另一个是key和value。首先api是非常安全的,但在使用第二个api时需要非常小心。

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

首先不保存任何参考活动的价值对象。这会导致内存泄漏,因为活动将具有强大的参考值,并且值具有View.class维护的静态HashMap的强大参考。

第二次每次查找gettag时,都必须查找一个hashmap和一个稀疏数组。这不是非常有效。

谢谢 Suriya。

相关问题