ListView优化
一、ListView简单优化
复用view的历史缓存对象
实例代码:
public View getView(init position,View convertView,ViewGroup parent){
View view;
if(convertView!=null){
view=convertView;
}else{
//创建新的view对象
view=View.inflate(BlackNumberActivity.this,R.layout.black_number_item,null);
}
TextView tv=(TextView)findViewById(R.id.tv);//找到条目上的TextView控件
}
二、ListView深度优化
原理:上面的优化方法中虽然将第一屏的view对象复用了历史缓存对象convertView,但是发现每次解析布局文件找到条目上的控件(即findViewById(R.id.tv))的时候很耗费资源
(注:找控件上的控件的过程就是解析xml文件,每调用一次findViewById就会在内存中解析一次xml文件所以比较耗费资源)
为了解决以上问题,我们可以这样做,定义一个静态内部类,随着外部类的加载该静态内部类里面的变量已加载到内存中,在加载第一屏条目的时候,就在内存中创建与屏幕上所能容纳的条目数量相同的对象,并且用setTag方法与条目上的控件绑定,这样条目上的控件就存储在第一次加载的时候存储在缓冲中,当复用历史缓存对象covertView的时候就不用再去解析xml文件了,这样就提高了效率节约了资源
1、定义一个容器,代码实现如下:
static class ViewHolder{
TextView tv_number;
TextView tv_mode;
}
2、当创建View的时候实例化容器
ViewHolder holder;
if(convertView!=null){
view=convertView;
holder=(ViewHolder)view.getTag();
}else{
//初始化容器
holder=new ViewHolder();
//设置该视图相关联的标记。一个标签可以用来标记一个视图层次结构
//和层次结构内不必是唯一的。标签也可以用来存储数据在一个视图没有求助于另一个数据结构
view.setTag(holder);
}
3、使用
holder.tv_number.setText(info.getNumber());
if("1".equals(info.getMode())){
holder.tv_mode.setText("拦截电话");
}else if("2".equals(info.getMOde())){
holder.tv_mode.setText("拦截短信");
}else if("3".equals(info.getMode())){
holder.tv_mode.setText("拦截电话+短信");
}
综合使用:
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return list.size();
}
/**
* convertView 缓存的view对象
*/
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder = null;
if (convertView != null) {
view = convertView;
// 从历史缓存的view中得到holder
holder = (ViewHolder) view.getTag();
Log.e(TAG, "===============历史缓存的view :" + position);
} else {
holder = new ViewHolder();
view = View.inflate(BlackNumberActivity.this,
R.layout.black_number_item, null);
Log.e(TAG, "==========新建的view :" + position);
// 把从view中得到的三个控件防盗holder中,就相当于缓存起来了
holder.tv_number = (TextView) view.findViewById(R.id.tv_number);
holder.tv_mode = (TextView) view.findViewById(R.id.tv_mode);
holder.iv_delete = (ImageView) view.findViewById(R.id.iv_delete);
// 把holder绑定给 view对象
view.setTag(holder);
}
final BlackNumberInfo info = list.get(position);
holder.iv_delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
delete(info);
}
});
holder.tv_number.setText(info.getNumber());
if ("1".equals(info.getMode())) {
holder.tv_mode.setText("电话拦截");
} else if ("2".equals(info.getMode())) {
holder.tv_mode.setText("短信拦截");
} else {
holder.tv_mode.setText("全部拦截");
}
return view;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
}
static class ViewHolder {
TextView tv_number;
TextView tv_mode;
ImageView iv_delete;
}