View的setTag()getTag()方法的主要目的是什么?

View类型对象的setTag()getTag()等方法的主要用途是什么? html

我是否正确地认为我能够将任意数量的对象与单个视图相关联? android


#1楼

这对于使用自定义ArrayAdapter很是有用。 这是某种优化。 setTag用做对象的引用,引用布局的某些部分(在ListView中显示)而不是findViewById异步

static class ViewHolder {
    TextView tvPost;
    TextView tvDate;
    ImageView thumb;
}

public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        LayoutInflater inflater = myContext.getLayoutInflater();
        convertView = inflater.inflate(R.layout.postitem, null);

        ViewHolder vh = new ViewHolder();
        vh.tvPost = (TextView)convertView.findViewById(R.id.postTitleLabel);
        vh.tvDate = (TextView)convertView.findViewById(R.id.postDateLabel);
        vh.thumb = (ImageView)convertView.findViewById(R.id.postThumb);
        convertView.setTag(vh);
    }
            ....................
}

#2楼

我想补充几句话。 布局

虽然在特定的ViewHolder模式中使用get/setTag(Object)彷佛很是有用,但我建议在其余状况下使用它以前要三思然后行。 几乎老是有另外一个好的设计解决方案。 post

主要缘由是代码很快就变得不受支持了。 优化

  • 对于其余开发人员而言,您设计为在视图中存储为标记的内容并不明显。 方法setTag / getTag根本不具备描述性。 spa

  • 它只存储一个Object ,因此当你想要getTag时它须要getTag 。 当您决定更改标记中存储对象的类型时,您可能会在之后遇到意外崩溃。 设计

  • 这是来自现实生活的故事。 咱们有一个很是大的项目,包含不少适配器,带有视图的异步操做等等。 一位开发人员决定在他的部分代码中set/getTag ,但另外一位开发人员已经为此视图设置了标记。 最后有人找不到本身的标签并且很是困惑。 花了咱们几个小时来找到这个bug。 code

setTag(int key, Object tag)看起来好多了,由于你能够为每一个标签生成惟一的密钥(使用id资源 ),但Android <4.0存在重大限制。 来自Lint文档: htm

在Android 4.0以前,View.setTag(int,Object)的实现会将对象存储在静态映射中,其中值被强烈引用。 这意味着若是对象包含指向上下文的任何引用,则上下文(指向其余全部内容)将泄漏。 若是传递视图,视图将提供对建立它的上下文的引用。 相似地,视图持有者一般包含视图,而游标有时也与视图相关联。


#3楼

对于Web开发人员来讲,这彷佛等同于数据 - ..


#4楼

与ID不一样,标签不用于标识视图。 标签本质上是能够与视图相关联的额外信息。 它们一般用做存储与视图自己中的视图相关的数据的便利,而不是将它们放在单独的结构中。

参考: http//developer.android.com/reference/android/view/View.html


#5楼

咱们可使用setTag()getTag()根据咱们的要求设置和获取自定义对象。 setTag()方法接受Object类型的参数, getTag()返回一个Object

例如,

Person p = new Person();
p.setName("Ramkailash");
p.setId(2000001);
button1.setTag(p);
相关文章
相关标签/搜索