BaseAdapter的使用步骤以及setTag和getTag的作用
2015-08-04 16:10
513 查看
<span style="font-size:18px;">package com.test1;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.example.mywork0803.R;
public class BaseAdapter_Main extends Activity {
// 定义初始化资源
private int[] image = { R.drawable.img_1, R.drawable.img_2,
R.drawable.img_3 };
private String[] name = { "张三", "李四", "王五" };
private int[] age = { 12, 33, 23 };
ListView listView;
MybaseAdapter mybaseAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.baseadapter_layout);
// 获取ListView的id
listView = (ListView) findViewById(R.id.my_list);
// 初始化适配器
mybaseAdapter = new MybaseAdapter(this);
// 添加适配器
listView.setAdapter(mybaseAdapter);
}
// 继承BaseAdapter
public class MybaseAdapter extends BaseAdapter {
private LayoutInflater minflater;
// 带参构造函数,将context传进来
public MybaseAdapter(Context context) {
// 填充布局
this.minflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return image.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
// 防止内存溢出
// 判断concertView是否存在
if (convertView == null) {
// 将布局填充进来
convertView = minflater.inflate(R.layout.base_litem, null);
viewHolder = new ViewHolder();
// viewHolder打上标签
convertView.setTag(viewHolder);
} else {
// concertView存在则将view重新赋给viewHolder
viewHolder = (ViewHolder) convertView.getTag();
}
// 获取convertView视图下的布局id
viewHolder.imageView = (ImageView) convertView
.findViewById(R.id.img_view);
viewHolder.imageView.setImageResource(image[position]);
viewHolder.txt_name = (TextView) convertView
.findViewById(R.id.txt_name);
viewHolder.txt_name.setText(" " + name[position]);
viewHolder.txt_age = (TextView) convertView
.findViewById(R.id.txt_age);
viewHolder.txt_age.setText(" " + age[position]);
// 返回view
return convertView;
}
}
// 创建ViewHolder对象,减少内存的消耗
public class ViewHolder {
ImageView imageView;
TextView txt_name;
TextView txt_age;
}
}
</span>
setTag是给View对象的一个标签,标签可以是任何内容,我们这里把他设置成了一个对象,因为我们是把xml的元素抽象出来成为一个类ViewHolder,用了setTag,这个标签就是ViewHolder实例化后对象的一个属性。我们之后对于ViewHolder实例化的对象holder的操作,都会因为java的引用机制而一直存活并改变convertView的内容,而不是每次都是去new一个。
由于setTag和getTag设置的是一个Object对象,可能会出现类的转换异常
不过,android4.0以后,有一个更好的方法:setTag(int key, Object tag)可以通过类似<k,v>键值对的方式存取。
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.example.mywork0803.R;
public class BaseAdapter_Main extends Activity {
// 定义初始化资源
private int[] image = { R.drawable.img_1, R.drawable.img_2,
R.drawable.img_3 };
private String[] name = { "张三", "李四", "王五" };
private int[] age = { 12, 33, 23 };
ListView listView;
MybaseAdapter mybaseAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.baseadapter_layout);
// 获取ListView的id
listView = (ListView) findViewById(R.id.my_list);
// 初始化适配器
mybaseAdapter = new MybaseAdapter(this);
// 添加适配器
listView.setAdapter(mybaseAdapter);
}
// 继承BaseAdapter
public class MybaseAdapter extends BaseAdapter {
private LayoutInflater minflater;
// 带参构造函数,将context传进来
public MybaseAdapter(Context context) {
// 填充布局
this.minflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return image.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
// 防止内存溢出
// 判断concertView是否存在
if (convertView == null) {
// 将布局填充进来
convertView = minflater.inflate(R.layout.base_litem, null);
viewHolder = new ViewHolder();
// viewHolder打上标签
convertView.setTag(viewHolder);
} else {
// concertView存在则将view重新赋给viewHolder
viewHolder = (ViewHolder) convertView.getTag();
}
// 获取convertView视图下的布局id
viewHolder.imageView = (ImageView) convertView
.findViewById(R.id.img_view);
viewHolder.imageView.setImageResource(image[position]);
viewHolder.txt_name = (TextView) convertView
.findViewById(R.id.txt_name);
viewHolder.txt_name.setText(" " + name[position]);
viewHolder.txt_age = (TextView) convertView
.findViewById(R.id.txt_age);
viewHolder.txt_age.setText(" " + age[position]);
// 返回view
return convertView;
}
}
// 创建ViewHolder对象,减少内存的消耗
public class ViewHolder {
ImageView imageView;
TextView txt_name;
TextView txt_age;
}
}
</span>
setTag是给View对象的一个标签,标签可以是任何内容,我们这里把他设置成了一个对象,因为我们是把xml的元素抽象出来成为一个类ViewHolder,用了setTag,这个标签就是ViewHolder实例化后对象的一个属性。我们之后对于ViewHolder实例化的对象holder的操作,都会因为java的引用机制而一直存活并改变convertView的内容,而不是每次都是去new一个。
由于setTag和getTag设置的是一个Object对象,可能会出现类的转换异常
不过,android4.0以后,有一个更好的方法:setTag(int key, Object tag)可以通过类似<k,v>键值对的方式存取。
相关文章推荐
- 表格标签table深入了解
- WEB标准网页布局中尽量不要使用的HTML标签
- web标准知识――用途相似的标签
- h1标签的使用技巧
- HTML代码中标签的全部属性 中文注释说明
- jquery 实现两Select 标签项互调示例代码
- jQuery获取标签文本内容和html内容的方法
- JavaScript获取并更改input标签name属性的方法
- css样式标签和js语法属性区别
- 关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
- jQuery如何获取同一个类标签的所有值(默认无法获取)
- 解决JSTL foEach标签 刷新报错的方法
- js改变embed标签src值的方法
- ThinkPHP模板判断输出Empty标签用法详解
- php实现html标签闭合检测与修复方法
- ThinkPHP模板范围判断输出In标签与Range标签用法详解
- ThinkPHP分组下自定义标签库实例
- 彻底删除thinkphp3.1案例blog标签的方法
- thinkphp特殊标签用法概述
- JavaScript中的标签语句用法分析