Android 缓存原理(一)----ListView缓存机制

一,ListView&GridView缓存机制

        ListView 是安卓常用组件之一,ListView的缓存机制也是面试官经常会问到问题。但是很多做安卓的对这个还是一知半解,今天就把这个问题在博客中好好总结,完全解决所有的疑惑。

        刚接触Android 的时候总会遇到此程序未响应的问题,往下拉着拉着就OOM了。原因就是Adapter没有写正确。

        这里先讲一下Adapter中GetView的正确写法,如下例:

      ViewHolder是一个内部类,其中包含了单个项目布局中的各个控件。

      

  1.  @Override  
  2.   public View getView(int position, View convertView, ViewGroup parent){  
  3.       final ViewHolder holder;  
  4.         if(convertView == null){  
  5.          //使用自定义的list_items作为Layout  
  6.          convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, parent, false);  
  7.          //使用减少findView的次数  
  8.       holder = new ViewHolder();  
  9.       holder.itemsIcon = ((ImageView) convertView.findViewById(R.id.itemsIcon)) ;  
  10.       holder.itemsTitle = ((TextView) convertView.findViewById(R.id.itemsTitle));  
  11.       holder.itemsText = ((TextView) convertView.findViewById(R.id.itemsText));  
  12.       //设置标记  
  13.       convertView.setTag(holder);  
  14.         }else{  
  15.           holder = (ViewHolder) convertView.getTag();  
  16.         }  
  17.         //获取该行数据  
  18.         Article mArticle = (Article)mList.get(position);  
  19.         //设置数据到View  
  20.         String imageUrl = (String)mArticle.getImageUrl();  
  21.         holder.itemsTitle.setText(mArticle.getTitle());  
  22.         holder.itemsText.setText(mArticle.getCreateTime());  
  23.         return convertView;  
  24.   }  
  25.     
  26.   /** 
  27. * ViewHolder类 
  28. */  
  29. tatic class ViewHolder {  
  30. ImageView itemsIcon;  
  31. TextView itemsTitle;  
  32. TextView itemsText;  


    1)关于SetTag方法
     convertView.setTag(holder);
    holder = (ViewHolder) convertView.getTag();
    View对象的一个标签,标签可以是任何内容,我们这里把他设置成了一个对象,因为我们是把.xml的元素抽象出来成为一个类ViewHolder,用了setTag,这个标签就是ViewHolder实例化后对象的一个属性。<我们之后对于ViewHolder实例化的对象holder的操作,都会因为java的引用机制而一直存活并改变convertView的内容,而不是每次都是去new一个。
  没有使用LayoutInflater对象进行View扩充的Tag的使用。
    if (convertView != null) {
      view = convertView; ...
       }
   else {
      view = new Xxx(...); 
 }

     

(2)ListView 图解 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值