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

本文探讨了在使用ListView显示大量条目时,通过复用历史缓存的view对象来减少内存消耗的方法,以及如何优化查找控件的流程以避免频繁创建新view对象带来的性能瓶颈。同时,介绍了适配器的实现细节,包括如何在创建和获取view时进行内存优化,以提升应用的响应速度和用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题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 {

       private   String   TAG =   "CallSmsSafeActivity" ;
       private   ListView   lv_callsms_safe ;
       private   BlackNumberDao   dao ;
       private   BlackNumberBean   blackNumberBean ;
       private   List<BlackNumberBean>   numberList   ;
       private   TextView    tv_number ;
       private   TextView    tv_mode ;
       private   ImageView   iv_delete ;
       @Override
       protected   void   onCreate(Bundle savedInstanceState) {
               super .onCreate(savedInstanceState);
            setContentView(R.layout.   activity_callsms_safe );
            
               dao =   new   BlackNumberDao(   this );
               numberList =   dao .getNumberInfo();
            
            
               lv_callsms_safe =(ListView) findViewById(R.id. lv_callsms_safe   );
               lv_callsms_safe .setAdapter(   new   MyAdapter());
            
            
      }
      
      
       /**
       * 创建适配器
       */
       public   class   MyAdapter    extends   BaseAdapter{

            
               @Override
               public   int   getCount() {
                  
                     return   numberList .size();
            }
            
            
               @Override
               public   View getView(   int   position, View convertView, ViewGroup parent) {
                  
                     //复用历史缓存view对象,减少内存消耗,防止内存溢出
                  View view=   null ;
                  ViewHolder holder=   null ;
                  
                     if (convertView!=   null &&convertView   instanceof   RelativeLayout){     //RelativeLayout:填充view的布局类型
                        view=convertView;
                        Log. i( TAG   ,   "复用历史缓存view:"   +position);
                        
                        holder=(ViewHolder) view.getTag();     //复用孩子的id
                        
                  }   else {
                        view = View. inflate(getApplicationContext(), R.layout. list_callsms_item , null   );
                        Log. i( TAG   ,   "创建新的view对象:"   +position);
                        
                        holder=   new   ViewHolder();     //初始化view持有者
                        
                           //只是在创建view的时候去寻找控件,然后把控件的id存起来
                        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   );
                        
                        view.setTag(holder);     //将holder存到view中
                  }
                  
                     //非常消耗内存
                     //View view = View.inflate(getApplicationContext(), R.layout.list_callsms_item,null);
                  
                  
                     blackNumberBean   =   numberList .get(position);
                   holder.   tv_number .setText(   "号码:" + blackNumberBean   .getNumber());
                   String mode=   blackNumberBean .getMode();
                     if (   "1" .equals(mode)){
                         holder.   tv_mode .setText(   "电话拦截" );
                   }   else   if (   "2" .equals(mode)){
                         holder.   tv_mode .setText(   "短信拦截" );
                   }   else   if (   "3" .equals(mode)){
                         holder.   tv_mode .setText(   "全部拦截" );
                   }
                  
                     return   view;
            }

               @Override
               public   Object getItem(   int   position) {
                  
                     return   null ;
            }

               @Override
               public   long   getItemId(   int   position) {
                  
                     return   0;
            }
            
            }
      
      
      
       /**
       * 创建view持有者,将需要找的控件的应用放在 viewholder
       */
       static   class   ViewHolder{
            
            TextView       tv_number ;
            TextView       tv_mode ;
            ImageView     iv_delete ;
      }
      
      
}
     
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值