位置: 编程技术 - 正文

ListView常见优化(如何让listview提高效率)

编辑:rootadmin

推荐整理分享ListView常见优化(如何让listview提高效率),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:list性能优化,listview viewholder优化,listview的优化方案,listview viewholder优化,listview viewholder优化,list性能优化,listview 优化,listview viewholder优化,内容如对您有帮助,希望把文章链接给更多的朋友!

如果一个listView不做任何的优化,而且有很多的条目,当我们快速的拖动listView的界面的时候,就不断的GCGC(Garbage Collection )垃圾回收,当GC到某个时候就会(OOM)outofmemory内存溢出,应用程序也就会随之挂掉,产生这个问题的原因是什么呢?我们知道listView的特点是每产生一个条目就会调用一次getView方法,如果我们不进行优化,每一次调用都要执行getView方法中的所有语句,而且会在最上面的条目移出界面的时候回收掉这个对象,这样是比较浪费资源的。

这时候我们就会想,如果在条目移出界面的时候不对它进行回收,而是拿回来再次使用,这样不就优化了ListView的效率了吗?幸好,一向给力的谷歌工程师为我们提供了ListView自身的缓存机制,它会缓存条目中的一个条目,当界面最上方的这个条目显示完成之后,就会出现一个缓存条目,也就是BaseView中getView方法中的convertView ,convertView的作用其实就是一个已经被系统回收的历史缓存View对象,我们可以利用这个对象就没有必要再重新去xml文件中去解析布局了。判断传进来的参数convertView是否为null,如果为null就创建convertView并返回,如果不为null,则直接使用。这是第一种优化方法,简单的说就是复用历史缓存的View对象,减少view对象创建的次数。

第二种优化方法是减少findViewById()的次数,findViewById是一个相对比较耗性能的操作,因为每次在getVIew的时候,都需要重新的findViewById,重新找到控件,然后进行控件的赋&#;以及事件相应设置。这样其实在做重复的事情,因为的getView中,其实包含有这些控件,而且这些控件的id还都是一样的,也就是其实只要在view中findViewById一次,后面无需要每次都要findViewById了。解决这个问题的方法就是把item里面的控件封装成一个javaBean,当item条目被加载的时候就去找到对应的控件 。

前两种优化方式是最一般的优化,一般我们使用listView的时候都会用到这两个优化方法,但是只有这两种方式还远远不够,比如当listView的View对象中有图片资源的时候,就会占用大量的内存,这样就很容易造成内存溢出,对于这种情况有两种优化方法,分批加载和分页加载,我把这两种方法看成是利用时间不同的优化和利用空间的不同的优化。分批加载,我们每次只加载一定数量,就像是在不同的时间段加载一次。而分页加载,就像是把一定数量的条目放在不同的空间,利用这两种思想来实现分批加载和分页加载。

分批加载主要解决的是用户体验的问题,如果数据量过大,用户等待的时间就会很长,而且也会出现Anr异常。比如我们要从数据库中读取条数据,如果一次性读取,就需要很长的时间,但是这时我们修改sql语句,指定从那一条开始获取数据,一共获取多少数据,sql语句是:

"selectphone,mode from blacknumber limit ? Offset ?",new String[]{String.valueOfa(maxNumber),String.valueOf(StateIndex)}

新获取的数据加到集合的末尾即可。

ListView常见优化(如何让listview提高效率)

说分页加载,它的实现思路是这样的,实现OnScrollListener接口,重写onScrollStateChanged和onScroll方法,使用onScroll方法实现“滑动”后处理检查是否还有新纪录,如果有,调用addFooterView,添加记录到adapter,adapter调用notifyDataSetChanged更新数据;如果没有新纪录了,把自定义的mFooterView去掉,使用onScrollStateChanged可以检测是否滚到最后一行且停止滚到然后执行加载。

还有一种优化方式是利用图片异步加载的方法,实现思路是:

1.先从内存缓存中获取图片显示(内存缓冲)

2.获取不到的话从SD卡里获取(SD卡缓冲,从SD卡获取图片是放在子线程里执行的,否则快速划瓶的话会不够流畅)

3.都获取不到的话从网络下载图片并保存到SD卡同时加入内存并显示(视情况看是否要显示)

我们在使用listview的时候可能会出现图片乱跳(错位)的问题:

图片错位问题的本质源于我们的listview使用了缓存convertView,假设一种场景,一个listview一屏显示九个item,那么在拉出第十个item的时候,事实上该item是重复使用了第一个item,也就是说在第一个item从网络中下载图片并最终要显示的时候,其实该item已经不在当前显示区域内了,此时显示的后果将可能在第十个item上输出图像,这就导致了图片错位的问题。所以解决之道在于可见则显示,不可见则不显示。在ImageLoader里有个imageViews的map对象,就是用于保存当前显示区域图像对应的url集,在显示前判断处理一下即可。

android退出整个应用程序 Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢?这里给大家三种比较简单的方法实现。首先要说明在B中

Fragment的使用 当你的应用需要支持很多种屏幕尺寸,你可以在不同的布局配置中重用你的Fragment组件在可用的屏幕尺寸上优化用户体验。例如,在手持设备中一次只显

Android基础教程(七)之----单选项框RadioGroup的综合应用 转自:

标签: 如何让listview提高效率

本文链接地址:https://www.jiuchutong.com/biancheng/386768.html 转载请保留说明!

上一篇:webView 手势缩放以及自适应屏幕(js手势放大缩小)

下一篇:android退出整个应用程序(android退出程序代码)

  • 税务免抵调库是什么意思
  • 非营利组织注销流程
  • 银行融资服务费怎么算
  • 代开专票收入未超30万税务怎么处理
  • 成品油跨月发票红字冲销步骤
  • 增值税一般纳税人证明怎么查询
  • 应交城建税和教育费附加计算分录
  • 记账凭证的具体审计目标
  • 预付卡销售和充值属于什么费用
  • 免税企业以前年收入多少
  • 企业所得税营业税金及附加
  • 专用发票丢失如何报销
  • 小规模纳税人开票额度
  • 延期申报增值税罚款
  • 建筑企业预收的工程款会计分录
  • 话费打印发票怎么缩小
  • 招待费进项税能抵扣嘛
  • 收到减免退税费是政府补助怎么记账?
  • 企业收到应收账款6要素哪个增加哪个减少
  • 事业单位洗车费如何入账
  • 收到银行本票的会计分录怎么写
  • 公司旅游费计入什么科目
  • 主板清除bios
  • 飞机电子普通发票6%税率可以抵扣吗
  • c 盘清理
  • win10移动热点开关自动弹回
  • Windows 11 CO-21H2 22000.194 正式版官方下载地址(附esd微软三语直链下载x64+arm64)
  • php常用的设计模式在开发中的实例
  • 增值税留抵退税账务处理
  • 企业政策性拆迁资产重置算支出吗
  • php获取操作系统
  • 其他收益属于利润表吗
  • 由浅入深英语怎么说
  • 补付转账支票会退回吗
  • redis常见问题解决
  • 贸易企业开发下游业务
  • 租赁汽车折旧年限怎么算
  • 高新企业的所得税
  • 外购商品转为自用固定资产,进项税
  • 个人代工程发票要缴纳的个税
  • 现金流量表中的现金流量包括哪些
  • 法人向公司账户打款
  • 分公司注销一般要多久
  • 记账金额怎么写
  • 员工垫付费用怎么做账
  • 一般纳税人增值税申报表怎么填写
  • 开具发票时如何做账务处理?
  • 购进生产免税货物用材料可以抵扣进项税额吗
  • 装修费摊销会计准则
  • 待抵扣进项税额和待认证进项税额的区别
  • 土地增值税的预缴
  • 金蝶软件kis标准版操作流程
  • 外汇账户具体包括哪些
  • 辅助生产成本应计入什么
  • sql中索引怎么使用
  • 安装Win8 64位旗舰版系统提示“windows无法安装到这个磁盘”的故障分析及解决方法
  • 如何将用户加入某个组
  • win7系统控制面板在哪里打开
  • win 8系统怎么样
  • linux ssh安装包
  • 命令行查看硬盘序列号
  • win8启动设置选哪个
  • win10桌面上怎么分成几个区域
  • win8系统触摸板按键不能用
  • perl执行shell命令
  • dos改时间
  • 用python写网页
  • python利用for循环求1到100的奇数之和
  • jquery设置滚动条到底部
  • Node.js中的事件循环是什么
  • 精仿和媲美专柜有什么区别
  • 三消游戏规则
  • javascript中array数组对象的含义及常用方法
  • js制作qq简易聊天框
  • javascript definitive guide
  • js过滤html代码
  • 河南税务总局发票查询
  • 小规模纳税人购买车辆如何入账
  • 比亚迪车载物联网卡
  • 司法拍卖车免除扣分吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设