【问题标题】:Android: What care should I take when using a View's setTag() property?Android:使用 View 的 setTag() 属性时应该注意什么?
【发布时间】:2009-10-13 16:06:44
【问题描述】:

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

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

【问题讨论】:

    标签: android views


    【解决方案1】:

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

    在不太了解您的特定问题的情况下,我会说 - 有时这很危险吗?是的,如果不负责任地使用。这是否意味着您应该不惜一切代价避免它?不,绝对不是。

    编辑:为什么要将视图的解析数据绑定到它们?

    您真的需要它吗,或者您可以填充某种类型的模型?如果您想在上下文中访问视图的标签,而您的视图不具有相同的含义/位置(就像我们最喜欢的 ViewHolder 示例中的convertView 所做的那样:)),我认为使用标签是可以的。

    否则,我敢肯定,如果您多考虑一下,您会找到更适合您的问题的另一种方法。

    【讨论】:

    • 是的。我听说过 ViewHolder 模式。谢谢......那是一种解脱......关于我的问题,我刚刚更新了我上面的问题......
    • 只是项目描述会根据正在查看的项目而不断变化。因此,如果我必须将一些信息传递给意图,我需要一些关于正在考虑的特定项目的额外信息。当然,我认为我夸大了说我会通过整个项目,但对我来说只有一两个属性就可以了。但是,我只想从性能的角度来了解...谢谢您的回复...
    【解决方案2】:

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

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

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

    第二次在内部查找 gettag 必须查找一个 hashmap 和一个稀疏数组。这不是很有效。

    谢谢 苏里亚。

    【讨论】:

      【解决方案3】:

      注意避免以下情况:

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

      • 某些库或其他机制将标签用作与您的使用无关的“技巧”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 2014-09-21
        • 2011-07-14
        相关资源
        最近更新 更多