当前位置: 首页 > news >正文

[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;
        }

 

相关文章:

  • sqlserver去重复数据
  • Quartz学习总结(1)——Spring集成Quartz框架
  • Gearman + PHP 实现分布式对象调用
  • JAVA数据库编程
  • DEDECMS之三 首页、列表页怎么调用文章内容
  • 在opencv中实现中文输出
  • 使用wget下载xcode
  • Java接口中的字段
  • jar包启动与停止
  • 怎么使用微信JSSDK的自定义分享功能
  • YII学习
  • 因为安迪的一句话,这2万5千人凭空多出9亿财富!_财经_腾讯网
  • Ant编译Hadoop 1.0.3的eclipse-plugin插件包
  • [译]使用jquery.cookie操作Cookie说明
  • Linux下Nginx源码安装
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • C语言笔记(第一章:C语言编程)
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Java 23种设计模式 之单例模式 7种实现方式
  • Javascript Math对象和Date对象常用方法详解
  • javascript 总结(常用工具类的封装)
  • PaddlePaddle-GitHub的正确打开姿势
  • React Native移动开发实战-3-实现页面间的数据传递
  • vue.js框架原理浅析
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 区块链分支循环
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • ​​​​​​​​​​​​​​Γ函数
  • #162 (Div. 2)
  • %@ page import=%的用法
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (3)nginx 配置(nginx.conf)
  • (C语言)球球大作战
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (力扣题库)跳跃游戏II(c++)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (推荐)叮当——中文语音对话机器人
  • (转)linux下的时间函数使用
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .aanva
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net 提取注释生成API文档 帮助文档
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • :“Failed to access IIS metabase”解决方法
  • @media screen 针对不同移动设备
  • @WebServiceClient注解,wsdlLocation 可配置
  • @取消转义