[android] 手机卫士黑名单功能(ListView优化)_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > [android] 手机卫士黑名单功能(ListView优化)

[android] 手机卫士黑名单功能(ListView优化)

 2016/5/13 5:30:36  陶士涵  程序员俱乐部  我要评论(0)
  • 摘要:上一篇记录了使用ListView展示出来了100条数据,当慢慢拖动的时候,不会有问题,但是当拖动很快的时候,应用会报anr错误查看错误日志,看到报OutOfMemoryError,内存不足ListView在显示条目的时候,每显示出来一条都会调用一下getView()方法这个方法里面将xml文件转成View对象非常的消耗资源,要避免频繁调用:在重写的getView()方法中,会传递进来一个View对象convertView当手向上拖动ListView的时候
  • 标签:手机 android 功能 view list 优化

上一篇记录了使用ListView展示出来了100条数据,当慢慢拖动的时候,不会有问题,但是当拖动很快的时候,应用会报anr错误

查看错误日志,看到报OutOfMemoryError内存不足

 

ListView在显示条目的时候,每显示出来一条都会调用一下getView()方法

 

这个方法里面将xml文件转成View对象非常的消耗资源,要避免频繁调用:

在重写的getView()方法中,会传递进来一个View对象convertView

当手向上拖动ListView的时候,上面隐藏出去一条的条目会保存在convertView对象中,这个convertView对象可以作为xml转换成的目标View对象

此时,创建新的View对象,只会在第一次屏幕展示的时候创建,之后的条目显示,都是使用的之前缓存的View对象

 

下面调用View对象的findViewById()方法,也非常消耗内存:

android布局中,是个典型的树结构,在查找控件的时候,需要遍历整个的结构,有可能非常消耗时间

定义一个内部类ViewHolder

定义属性根据业务

getView()方法中,获取ViewHolder对象

赋值ViewHolder对象的属性,findViewById()查找到的View控件对象

当转换成的View对象创建的时候,调用View对象的setTag()方法,参数:VIewHolder对象

使用View对象的getTag()方法,获取出ViewHolder对象使用

    class ViewHolder{
        public TextView phoneView;
        public TextView modeView;
    }
    private class MyAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return infos.size();
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
            ViewHolder holder=new ViewHolder();
            if(convertView==null){
                view = View.inflate(CallSmsSafeActivity.this,
                        R.layout.list_call_sms_safe_item, null);
                holder.phoneView=(TextView) view
                        .findViewById(R.id.tv_main_phone);
                holder.modeView=(TextView) view
                        .findViewById(R.id.tv_block_mode);
                view.setTag(holder);
                System.out.println("创建新的View对象"+position);
            }else{
                view=convertView;
                holder=(ViewHolder) view.getTag();
                System.out.println("使用历史View对象"+position);
            }
            
            
            holder.phoneView.setText(infos.get(position).get("phone"));
            switch (infos.get(position).get("mode")) {
            case "1":
                holder.modeView.setText("电话拦截");
                break;
            case "2":
                holder.modeView.setText("短信拦截");
                break;
            case "3":
                holder.modeView.setText("全部拦截");
                break;
            default:
                break;
            }
            
            return view;
        }

 

发表评论
用户名: 匿名