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控件}
原理:上面的优化方法中虽然将第一屏的view对象复用了历史缓存对象convertView,但是发现每次解析布局文件找到条目上的控件(即findViewById(R.id.tv))的时候很耗费资源
(注:找控件上的控件的过程就是解析xml文件,每调用一次findViewById就会在内存中解析一次xml文件所以比较耗费资源)
为了解决以上问题,我们可以这样做,定义一个静态内部类,随着外部类的加载该静态内部类里面的变量已加载到内存中,在加载第一屏条目的时候,就在内存中创建与屏幕上所能容纳的条目数量相同的对象,并且用setTag方法与条目上的控件绑定,这样条目上的控件就存储在第一次加载的时候存储在缓冲中,当复用历史缓存对象covertView的时候就不用再去解析xml文件了,这样就提高了效率节约了资源
1、定义一个容器,代码实现如下:
static class ViewHolder{TextView tv_number;TextView tv_mode;}
ViewHolder holder;if(convertView!=null){view=convertView;holder=(ViewHolder)view.getTag();}else{//初始化容器holder=new ViewHolder();//设置该视图相关联的标记。一个标签可以用来标记一个视图层次结构//和层次结构内不必是唯一的。标签也可以用来存储数据在一个视图没有求助于另一个数据结构view.setTag(holder);}
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 {@Overridepublic int getCount() {return list.size();}/*** convertView 缓存的view对象*/@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {View view;ViewHolder holder = null;if (convertView != null) {view = convertView;// 从历史缓存的view中得到holderholder = (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() {@Overridepublic 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;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}}static class ViewHolder {TextView tv_number;TextView tv_mode;ImageView iv_delete;}
原文:http://www.cnblogs.com/candledragle/p/4254617.html