/**
* 加工ListView中的条目
*/
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// 刚开始会先加载页面能够容纳个数的View,在往下翻会再加载一个,之后便会使用缓存的。
// 加载View与View中的控件
View view;
ViewHolder holder;
// 判断之前是否已经加载过
if (convertView != null) {
// 如果已经加载过View,那么使用缓存
view = convertView;
// 得到view容器
holder = (ViewHolder) view.getTag();
} else {
// 如果没有加载过View,加载
view = View.inflate(CallSmsSafeActivity.this,
R.layout.list_callsmssafe_item, null);
// 加载控件,给view容器设置控件
holder = new ViewHolder();
holder.tv = (TextView) view.findViewById(R.id.tv);
holder.iv = (ImageView) view.findViewById(R.id.iv);
// 设置标签,使View对象与容器关联
view.setTag(holder);
}
//给控件设置内容
holder.tv.setText(phone);
holder.iv.setImageBitmap(bm);
return view;
}
/**
* 缓存Item中的控件,Item中view的容器
*/
static class ViewHolder {
TextView tv
ImageView iv;
}
说明:
ListView的视图优化可分为三步。
1.复用convertView,减少加载view。
如果convertView为空,那么说明还没有生成listview,需要加载页面中能看到个数的view。
如果convertView不为空,这时已经生成了listview,并且可以复用convertView。
if (convertView != null) {
view = convertView;
}else{
view = View.inflate(xxx);
}
2.编写view容器ViewHolder,将Item中的view添加到容器中。
因为如果每次通过view.findViewById方法查找Item身上的控件,会非常消耗资源。
所以可以使用一个view容器,在加载Item时,把所有的view添加进容器中,然后设置给item。
后面再次复用Item时就不必每次查找view了而是直接使用容器中的view。
if (convertView != null) {
view = convertView;
// 得到view容器
holder = (ViewHolder) view.getTag();
} else {
view = View.inflate(CallSmsSafeActivity.this,R.layout.list_callsmssafe_item, null);
// 加载控件,给view容器设置控件
holder = new ViewHolder();
holder.tv = (TextView) view.findViewById(R.id.tv);
holder.iv = (ImageView) view.findViewById(R.id.iv);
// 设置标签,使View对象与容器关联
view.setTag(holder);
}
3.ViewHolder类用static修饰
如果是非静态的累,在一开始加载可见Item个数的时候,每次都会讲该类字节码加载到内存。
如果使用static修饰,那么只需要将字节码加载到内存一次即可。