您的位置:首页 > 移动开发 > Android开发

Android ListView使用convertView解决内存溢出问题(推介使用recyclerview,listview已过时)

2015-12-22 14:27 731 查看
比方说在加载各种图片的时候,listview不及时回收的话,可能会造成内存溢出,这个时候就是看getview方法的时候了。

public View getView(int position, View convertView, ViewGroup parent) {

      

      ViewHolder holder = null;

      if(convertView == null){

        // 不存在则加载新布局

        LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        convertView = inflater.inflate(R.layout.item_pic_list, null);

        holder = new ViewHolder();

        holder.text = (TextView) convertView.findViewById(R.id.item_title);

        holder.image = (ImageView) convertView.findViewById(R.id.item_image);

        convertView.setTag(holder);

      } else {

        // 存在则加载原来布局,布局重用,无需重复加载

        holder = (ViewHolder) convertView.getTag();

      }

      

      int no = position + 1;

      holder.text.setText("图片列表测试:" + no);

      // ir是i5suoi库中ImageResource的实例,专门负责单例加载图片资源,并及时释放长时间不用的图片内存

      // 先设置成默认图片,以便能够将列表中不显示在屏幕上的图片及时回收

      holder.image.setImageBitmap(ir.getBitmap(getResources(), R.drawable.ic_launcher));

      // 加载并显示网络图片,每个图片只加载一次,然后存到本地缓存

      ir.getBitmap(holder.image, pic.replace("_num", "" + no % 60),

          holder.image.getWidth(), holder.image.getHeight());

      

      return convertView;

    }

代码注释很清晰,这里就不多做解释,只说一些注意事项。首先是本地的图片也要用ImageResource加载,才能保证每个图片只加载一次,不浪费资源和内存。其次,也是最重要的,虽然不用每次重新加载布局,但是有必要将图片重新设置成默认的,表示原来的图片暂不使用了,以便系统能够在内存使用过大时及时收回当前界面不使用的图片。

最后,如果上述你都做到的话,你的listview已经优化的很好了。针对你的问题,你的listview控件高度是否设置为fill_parent,因为warp会导致listview滑动中无限计算自身高度。你的文本加载是否做过线程以及多次重复加载的问题处理。你的item中变量是否多次无限生成新的内存对象等等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息