您的位置:首页 > 其它

4.10 优化LIstView: 在listView中复用历史缓存view对象减少内存开销

2013-10-27 00:13 411 查看
问题1: 在listview中的中,在手指拖动listview,创建一个新的item的时候都会调用getView 方法,getview这个方法本身就比较消耗内存,假如listview要显示成百上千个条目,每次手指拖动时都要调用getView方法去加载item,这是非常消耗内存的事件,会出现内存溢出


解决办法: 优化listview,复用历史缓存的view对象

问题2:在listView中 tv_number=(TextView)
view.findViewById(R.id. tv_number);
也是一件非常消耗内存的操作

解决办法:只是在创建view对象的时候去寻找控件,然后把控件的id引用存起来,复用历史缓存的view的时候复用存起来的控件id
 
 
 



 
 



 
 
 



 

---------------------------------------------------------

public class CallSmsSafeActivity extends Activity
{
[align=left]
[/align]
[align=left]      private String TAG= "CallSmsSafeActivity";[/align]
[align=left]      private ListView lv_callsms_safe;[/align]
      private 
BlackNumberDao dao;
      private 
BlackNumberBean blackNumberBean;
      private 
List<BlackNumberBean> numberList ;
[align=left]      private TextView  tv_number;[/align]
[align=left]      private TextView  tv_mode;[/align]
[align=left]      private ImageView iv_delete;[/align]
[align=left]      @Override[/align]
      protected void onCreate(Bundle
savedInstanceState) {
[align=left]             super.onCreate(savedInstanceState);[/align]
[align=left]            setContentView(R.layout. activity_callsms_safe);[/align]
[align=left]            [/align]
[align=left]             dao= new BlackNumberDao( this);[/align]
[align=left]             numberList= dao.getNumberInfo();[/align]
[align=left]            [/align]
[align=left]            [/align]
             lv_callsms_safe=(ListView)
findViewById(R.id.lv_callsms_safe );
[align=left]             lv_callsms_safe.setAdapter( new MyAdapter());[/align]
[align=left]            [/align]
[align=left]            [/align]
[align=left]      }[/align]
[align=left]      [/align]
[align=left]      [/align]
[align=left]      /**[/align]
[align=left]       * 创建适配器[/align]
[align=left]       */[/align]
[align=left]      public class MyAdapter  extends BaseAdapter{[/align]
[align=left]
[/align]
[align=left]            [/align]
[align=left]             @Override[/align]
             public int getCount()
{
[align=left]                  [/align]
[align=left]                   return numberList.size();[/align]
[align=left]            }[/align]
[align=left]            [/align]
[align=left]            [/align]
[align=left]             @Override[/align]
             public View
getView( int position, View convertView, ViewGroup
parent) {
[align=left]                  [/align]
[align=left]                   //复用历史缓存view对象,减少内存消耗,防止内存溢出[/align]
[align=left]                  View view= null;[/align]
[align=left]                  ViewHolder holder= null;[/align]
[align=left]                  [/align]
[align=left]                   if(convertView!= null&&convertView instanceof RelativeLayout){   //RelativeLayout:填充view的布局类型[/align]
[align=left]                        view=convertView;[/align]
[align=left]                        Log. i(TAG , "复用历史缓存view:" +position);[/align]
[align=left]                        [/align]
[align=left]                        holder=(ViewHolder) view.getTag();   //复用孩子的id[/align]
[align=left]                        [/align]
[align=left]                  } else{[/align]
[align=left]                        view = View. inflate(getApplicationContext(), R.layout.list_callsms_item,null );[/align]
[align=left]                        Log. i(TAG , "创建新的view对象:" +position);[/align]
[align=left]                        [/align]
[align=left]                        holder= new ViewHolder();   //初始化view持有者[/align]
[align=left]                        [/align]
[align=left]                         //只是在创建view的时候去寻找控件,然后把控件的id存起来[/align]
                        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 );
[align=left]                        [/align]
[align=left]                        view.setTag(holder);   //将holder存到view中[/align]
[align=left]                  }[/align]
[align=left]                  [/align]
[align=left]                   //非常消耗内存[/align]
                   //View view = View.inflate(getApplicationContext(),
R.layout.list_callsms_item,null);
[align=left]                  [/align]
[align=left]                  [/align]
[align=left]                   blackNumberBean = numberList.get(position);[/align]
[align=left]                   holder. tv_number.setText( "号码:"+blackNumberBean .getNumber());[/align]
[align=left]                   String mode= blackNumberBean.getMode();[/align]
[align=left]                   if( "1".equals(mode)){[/align]
[align=left]                         holder. tv_mode.setText( "电话拦截");[/align]
[align=left]                   } else if( "2".equals(mode)){[/align]
[align=left]                         holder. tv_mode.setText( "短信拦截");[/align]
[align=left]                   } else if( "3".equals(mode)){[/align]
[align=left]                         holder. tv_mode.setText( "全部拦截");[/align]
[align=left]                   }[/align]
[align=left]                  [/align]
[align=left]                   return view;[/align]
[align=left]            }[/align]
[align=left]
[/align]
[align=left]             @Override[/align]
             public Object
getItem( int position) {
[align=left]                  [/align]
[align=left]                   return null;[/align]
[align=left]            }[/align]
[align=left]
[/align]
[align=left]             @Override[/align]
             public long getItemId( int position)
{
[align=left]                  [/align]
[align=left]                   return 0;[/align]
[align=left]            }[/align]
[align=left]            [/align]
[align=left]            }[/align]
[align=left]      [/align]
[align=left]      [/align]
[align=left]      [/align]
[align=left]      /**[/align]
[align=left]       * 创建view持有者,将需要找的控件的应用放在 viewholder中[/align]
[align=left]       */[/align]
[align=left]      static class ViewHolder{[/align]
[align=left]            [/align]
[align=left]            TextView     tv_number;[/align]
[align=left]            TextView     tv_mode;[/align]
[align=left]            ImageView   iv_delete;[/align]
[align=left]      }[/align]
[align=left]      [/align]
[align=left]      [/align]
[align=left]}[/align]
[align=left]     [/align]

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: