View类型对象的setTag()和getTag()等方法的主要用途是什么?
我是否正确地认为我可以将任意数量的对象与单个视图相关联?
#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)似乎非常有用,但我建议在其他情况下使用它之前要三思而后行。 几乎总是有另一个好的设计解决方案。
主要原因是代码很快就变得不受支持了。
对于其他开发人员而言,您设计为在视图中存储为标记的内容并不明显。 方法setTag / getTag根本不具有描述性。
它只存储一个Object ,所以当你想要getTag时它需要getTag 。 当您决定更改标记中存储对象的类型时,您可能会在以后遇到意外崩溃。
这是来自现实生活的故事。 我们有一个非常大的项目,包含很多适配器,带有视图的异步操作等等。 一位开发人员决定在他的部分代码中set/getTag ,但另一位开发人员已经为此视图设置了标记。 最后有人找不到自己的标签而且非常困惑。 花了我们几个小时来找到这个bug。
setTag(int key, Object tag)看起来好多了,因为你可以为每个标签生成唯一的密钥(使用id资源 ),但Android <4.0存在重大限制。 来自Lint文档:
在Android 4.0之前,View.setTag(int,Object)的实现会将对象存储在静态映射中,其中值被强烈引用。 这意味着如果对象包含指向上下文的任何引用,则上下文(指向其他所有内容)将泄漏。 如果传递视图,视图将提供对创建它的上下文的引用。 类似地,视图持有者通常包含视图,而游标有时也与视图相关联。
#3楼
对于Web开发人员来说,这似乎等同于数据 - ..
#4楼
与ID不同,标签不用于标识视图。 标签本质上是可以与视图相关联的额外信息。 它们通常用作存储与视图本身中的视图相关的数据的便利,而不是将它们放在单独的结构中。
#5楼
我们可以使用setTag()和getTag()根据我们的要求设置和获取自定义对象。 setTag()方法接受Object类型的参数, getTag()返回一个Object 。
例如,
Person p = new Person();
p.setName("Ramkailash");
p.setId(2000001);
button1.setTag(p);