内存泄漏优化---ListView的优化

简述:

    在开发中ListView通常是很多时候都会用到的,那么对ListView的优化就显得尤为重要,对于ListView的优化主要从三个方面着手:

    ① 采用ViewHolder避免在getView()方法中执行耗时操作; 

    ② 根据列表的滑动状态来控制任务的执行频率;

    ③ 尝试开启硬件加速来使ListView更加流畅。

优化方案:

1、利用ViewHolder避免在getView()方法中执行耗时操作

    (1) 创建ViewHolder内部类(其实就是自定义的模型类),这样可以把item中的多个散落的控件整合为一个整体,同时可以避免错位等问题
    (2) 重用convertView,这样做在很大程度上会减少内存的消耗(减少ViewHolder对象实例化的次数。减少内存开销,提高性能)
     z    
    (3) 利用convertView的setTag()方法,节约了执行findViewById()的时间,提升了加载速度,节省了性能的开销。

    示例代码如下:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.layout_listview_item, null);
            viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_lv_mainactivity);
            viewHolder.textView = (TextView) convertView.findViewById(R.id.txt_lv_mainactivity);
            convertView.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        MyBean bean = mList.get(position);
      
        viewHolder.imageView.setImageResource(bean.getImgRes());
        viewHolder.textView.setText(bean.getText());
       

        return convertView;
    }

    class ViewHolder {
        ImageView imageView;
        TextView textView;
    }

2、根据列表的滑动状态来控制任务的执行频率

    在ListView快速滑动状态时可以采用“懒加载模式”,这样做不但减少了不断执行异步任务的开销,而且提高了界面的流畅度,从而提升了用户体验度。

    方案:在适配器Adapter中添加判断是否是“懒加载模式”的标识位,从而根据标识位的状态采取不同的加载模式。是否采取懒加模式是根据监听ListView的滑动状态。

    示例代码:

    ①:监听ListView的滑动状态

lv.setOnScrollListener(new AbsListView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                switch (scrollState) {
                    case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
                        adapter.setLazyLoadMode(true);
                        adapter.notifyDataSetChanged();
                        break;
                    case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
                        adapter.setLazyLoadMode(false);
                        adapter.notifyDataSetChanged();
                        break;
                    case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                        adapter.setLazyLoadMode(false);
                        adapter.notifyDataSetChanged();
                        break;

                    default:
                        break;
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            }
        });

     ② 在Adapter中设置改变“懒加载标识位”的函数,并根据标识位作出相应的操作

/**
 * Created by lizhenya.
 */
public class MyAdapter extends BaseAdapter {
    private Context mCtx;
    private ArrayList<MyBean> mList;
    private LayoutInflater inflater;
    private boolean isLazyMode;

    /**
     * 构造方法
     *
     * @param context
     * @param list
     */
    public MyAdapter(Context context, ArrayList<MyBean> list) {
        this.mCtx = context;
        this.mList = list;

        inflater = LayoutInflater.from(context);
        isLazyMode = false;
    }

    /**
     * 方法描述:设置“懒加载”标志位
     *
     * @param isLazy
     */
    public void setLazyLoadMode(boolean isLazy) {
        this.isLazyMode = isLazy;
    }

    @Override
    public int getCount() {
        return mList == null ? 0 : mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.layout_listview_item, null);
            viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_lv_mainactivity);
            viewHolder.textView = (TextView) convertView.findViewById(R.id.txt_lv_mainactivity);
            convertView.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        MyBean bean = mList.get(position);
        //判断是否为“懒加载模式”
        if (!isLazyMode) {
            viewHolder.imageView.setImageResource(bean.getImgRes());
            viewHolder.textView.setText(bean.getText());
        } else {
            viewHolder.imageView.setImageResource(R.mipmap.loading);
            viewHolder.textView.setText("......");
        }


        return convertView;
    }

    static class ViewHolder {
        ImageView imageView;
        TextView textView;
    }
}

3、开启硬件加速来使ListView更加流畅

    目前,Android对硬件加速的支持并非完美,有些绘制操作在开启硬件加速的情况下不能正常工作。具体可参考:详解Android开发中硬件加速支持的使用方法


代码资源:ListView的优化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值