关于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型的。
不知道我表述清楚没有,谢谢了!!!!
展开
 我来答
悲愤的豆芽
推荐于2017-09-17 · TA获得超过374个赞
知道小有建树答主
回答量:269
采纳率:0%
帮助的人:211万
展开全部
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)可以通过类似键值对的方式存取。

根据以上,你这个转型是不可行的哦。
Storm代理
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企... 点击进入详情页
本回答由Storm代理提供
heptnaol
2015-06-28 · TA获得超过7262个赞
知道大有可为答主
回答量:7120
采纳率:78%
帮助的人:1814万
展开全部
不知道是什么具体问题?
明白你的问题所在了,这里因为setTag是你调用的,所以你一定知道set进去的是个什么东西。
如果你set进去的时候,不止一种东西,比如你用TextView和ImageView两种作为tag
那么取的时候,就要用instanceof依次判断。
还是那句话,因为是你调用的,所以如果是一种东西,你一定知道它是什么类型
如果是多种,也一定是有限的类型,你可以用if else if结构的instanceof判断出来。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Lrding
2012-04-02 · TA获得超过1423个赞
知道答主
回答量:39
采纳率:100%
帮助的人:46.3万
展开全部
你这些操作都是在getView方法里做的,你都指定了convertView去绑定一个TextView,当然你取convertView中的Tag也要相应的做出强制类型转换(TextView)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
632578551
2013-03-18
知道答主
回答量:61
采纳率:0%
帮助的人:12.8万
展开全部
你在本类方法中设定绑定与取绑定所以 这样是可以的
当然 推存使用settag的 key values 模式
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
晚安丶羅力
2012-10-08
知道答主
回答量:2
采纳率:0%
帮助的人:3万
展开全部
?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式