setTag()

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)可以通过类似键值对的方式存取。
是设置标签,getTag()是获取标签,作用为:


### 关于 `setTag` 方法的使用 `setTag` 是一种用于在视图(View)对象中存储额外数据的方法。这种方法的主要目的是简化对视图相关联数据的操作,使得开发者可以在不依赖外部变量的情况下管理视图的状态或其他附加信息。 #### 基础概念 `setTag` 可以接受任意类型的对象作为参数,并将其绑定到指定的视图上。之后可以通过调用 `getTag()` 来检索之前设置的对象[^2]。这种机制特别适用于需要动态管理和识别多个视图的情况,比如在一个列表或网格布局中的项目。 #### 使用场景 1. **存储额外数据**:可以将与某个特定视图相关的元数据保存起来以便稍后访问。 2. **辅助识别和操作视图**:通过分配独特的标签给不同视图来帮助区分它们并执行相应的行为逻辑。 #### 示例代码 下面提供了一个基于 Android 平台的例子展示如何利用 `setTag` 和 `getTag` 进行基本的数据传递以及优化 ListView 中 ViewHolder 模式的应用: ```java // 定义 Adapter 类继承 BaseAdapter 实现必要的接口方法 @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null){ LayoutInflater inflater = LayoutInflater.from(context); convertView = inflater.inflate(R.layout.list_item_layout, parent, false); // 创建 ViewHolder 对象并将组件初始化赋值进去 ViewHolder holder = new ViewHolder(); holder.imageView = (ImageView) convertView.findViewById(R.id.image_view); holder.textView = (TextView) convertView.findViewById(R.id.text_view); // 将 ViewHolder 设置为当前 item 的 tag 属性 convertView.setTag(holder); } // 获取之前存入的 ViewHolder 数据 ViewHolder holder = (ViewHolder) convertView.getTag(); // 根据位置加载对应资源文件填充至 ImageView 和 TextView 组件里 holder.imageView.setImageResource(imageResources[position]); holder.textView.setText(texts[position]); return convertView; } static class ViewHolder{ ImageView imageView; TextView textView; } ``` 上述例子展示了如何有效地运用 `setTag` 提升性能的同时保持清晰简洁的代码结构[^4]。 ### 注意事项 尽管 `setTag` 非常有用,但在实际编程过程中也需要注意一些潜在的风险: - 不要滥用此特性去替代正式模型层的设计; - 考虑内存泄漏的可能性——尤其是当把复杂对象放入 Tag 时更需谨慎对待生命周期问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值