zoukankan      html  css  js  c++  java
  • [android] 手机卫士黑名单功能(ListView优化)

    上一篇记录了使用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;
            }

  • 相关阅读:
    hangfire 本地可以正常打开hangfire页面,发布后报401
    core 引用webservice
    ABP自带原框架生成使用
    ABP框架问题排查记录
    转-image js binary
    贪心算法
    动态规划-练习
    分治算法-快速,归并
    ECMAScript5的新特性
    css-动画
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5487677.html
Copyright © 2011-2022 走看看