关于Android的setTag()方法和getTag()的一个问题
我在做一个Android开发小示例的时候遇到了这个问题:在程序画红线的地方,text=(TextView)convertView.getTag();查看API后知道还有一...
我在做一个Android开发小示例的时候遇到了这个问题:
在程序画红线的地方,text = (TextView) convertView.getTag();查看API后知道还有一个setTag(Object o)方法,既然参数是Object类型的,那就是说可以是任意类型,text = (TextView) convertView.getTag();,但这句话将getTag()返回的Object对象强制转型为TextVIew,这个转型一定能行吗?可能以前setTag()的参数并不是TextView型的。
不知道我表述清楚没有,谢谢了!!!! 展开
在程序画红线的地方,text = (TextView) convertView.getTag();查看API后知道还有一个setTag(Object o)方法,既然参数是Object类型的,那就是说可以是任意类型,text = (TextView) convertView.getTag();,但这句话将getTag()返回的Object对象强制转型为TextVIew,这个转型一定能行吗?可能以前setTag()的参数并不是TextView型的。
不知道我表述清楚没有,谢谢了!!!! 展开
展开全部
setTag()是设置标签,getTag()是获取标签,作用为:
1.用于区分很多相似的View
例如:
button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
它们可能执行相似的逻辑,但你必须分别为两个Button设置两个独立的OnClick事件,
public void onClick(View v) {
doAction(1); // 1 for button1, 2 for button2, etc.
}
之所以这样做,因为onClick只有一个参数View。我们可以通过setTag和getTag来完成:
button1.setTag(1);
button2.setTag(2);
我们可以将两个button设置同一个OnClickListener,比如:
listener = new OnClickListener() {
@Override
public void onClick(View v) {
doAction(v.getTag());
}
};
这样,就能够通过getTag区分。
2.用于ListView的复用
我们自己写自定义adapter的时候,通常会使用它,比如:
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);
}
....................
}
3.注意:
除了上述情况以外,我们尽量不要直接使用,原因:
1.代码可读性:会给其他的程序员造成困扰
2.由于setTag和getTag设置的是一个Object对象,可能会出现类的转换异常
不过,android4.0以后,有一个更好的方法:setTag(int key, Object tag)可以通过类似键值对的方式存取。
根据以上,你这个转型是不可行的哦。
1.用于区分很多相似的View
例如:
button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
它们可能执行相似的逻辑,但你必须分别为两个Button设置两个独立的OnClick事件,
public void onClick(View v) {
doAction(1); // 1 for button1, 2 for button2, etc.
}
之所以这样做,因为onClick只有一个参数View。我们可以通过setTag和getTag来完成:
button1.setTag(1);
button2.setTag(2);
我们可以将两个button设置同一个OnClickListener,比如:
listener = new OnClickListener() {
@Override
public void onClick(View v) {
doAction(v.getTag());
}
};
这样,就能够通过getTag区分。
2.用于ListView的复用
我们自己写自定义adapter的时候,通常会使用它,比如:
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);
}
....................
}
3.注意:
除了上述情况以外,我们尽量不要直接使用,原因:
1.代码可读性:会给其他的程序员造成困扰
2.由于setTag和getTag设置的是一个Object对象,可能会出现类的转换异常
不过,android4.0以后,有一个更好的方法:setTag(int key, Object tag)可以通过类似键值对的方式存取。
根据以上,你这个转型是不可行的哦。
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企...
点击进入详情页
本回答由Storm代理提供
展开全部
不知道是什么具体问题?
明白你的问题所在了,这里因为setTag是你调用的,所以你一定知道set进去的是个什么东西。
如果你set进去的时候,不止一种东西,比如你用TextView和ImageView两种作为tag
那么取的时候,就要用instanceof依次判断。
还是那句话,因为是你调用的,所以如果是一种东西,你一定知道它是什么类型
如果是多种,也一定是有限的类型,你可以用if else if结构的instanceof判断出来。
明白你的问题所在了,这里因为setTag是你调用的,所以你一定知道set进去的是个什么东西。
如果你set进去的时候,不止一种东西,比如你用TextView和ImageView两种作为tag
那么取的时候,就要用instanceof依次判断。
还是那句话,因为是你调用的,所以如果是一种东西,你一定知道它是什么类型
如果是多种,也一定是有限的类型,你可以用if else if结构的instanceof判断出来。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这些操作都是在getView方法里做的,你都指定了convertView去绑定一个TextView,当然你取convertView中的Tag也要相应的做出强制类型转换(TextView)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你在本类方法中设定绑定与取绑定所以 这样是可以的
当然 推存使用settag的 key values 模式
当然 推存使用settag的 key values 模式
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |