ListView的四种优化方式

优化方式一:

  • convertView的复用

  第一种优化就是重用convertView,这也是最简单的一种优化方式,就是在Adapter类的getView方法中通过判断convertView是否为null,是的话就需要在创建一个视图出来,然后给视图设置数据,最后将这个视图返回给底层,呈现给用户;如果不为null的话,其他新的view可以通过复用的方式使用已经消失的条目view,重新设置上数据然后展现出来。

代码如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {//如果当前的convertView为null,则通过inflate产生一个viewconvertView = View.inflate(context, R.layout.layout_pic_item,null);}TextView tvDis = (TextView) convertView.findViewById(R.id.tv_item_picture_desc);tvDis.setText("设置数据");return convertView;
}

优化方式二:

  • ViewHolder的使用

  第一种优化方式有个缺点,就是每次在findviewById,重新找到控件,然后对控件进行赋值,这样会减慢加载的速度,其实我们可以创建一个内部类ViewHolder,里面的成员变量和view中所包含的组件个数、类型相同,在convertview为null的时候,把findviewbyId找到的控件赋给ViewHolder中对应的变量,就相当于先把它们装进一个容器,下次要用的时候,直接从容器中获取,这样是不是比findviewbyId效率要高一点?

需要用到两个方法:setTaggetTag方法:

    @Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;View itemView = null;if (convertView == null) {itemView = View.inflate(context, R.layout.item_news_data, null);holder = new ViewHolder(itemView);//用setTag的方法把ViewHolder与convertView "绑定"在一起itemView.setTag(holder);} else {//当不为null时,我们让itemView=converView,用getTag方法取出这个itemView对应的holder对象,就可以获取这个itemView对象中的组件itemView = convertView;holder = (ViewHolder) itemView.getTag();}NewsBean newsBean = newsListDatas.get(position);holder.tvNewsTitle.setText(newsBean.title);holder.tvNewsDate.setText(newsBean.pubdate);mBitmapUtils.display(holder.ivNewsIcon, newsBean.listimage);return itemView;}}public class ViewHolder {@ViewInject(R.id.iv_item_news_icon)private ImageView ivNewsIcon;// 新闻图片@ViewInject(R.id.tv_item_news_title)private TextView tvNewsTitle;// 新闻标题@ViewInject(R.id.tv_item_news_pubdate)private TextView tvNewsDate;// 新闻发布时间@ViewInject(R.id.tv_comment_count)private TextView tvCommentIcon;// 新闻评论public ViewHolder(View itemView) {ViewUtils.inject(this, itemView);}
}

优化方式三:

  • 使用分段加载

有些情况下我们需要加载网络中的数据,显示到ListView,而往往此时都是数据量比较多的一种情况,如果数据有1000条,没有优化过的ListView都是会一次性把数据全部加载出来的,很显然需要一段时间才能加载出来,我们不可能让用户面对着空白的屏幕等好几分钟,那么这时我们可以使用分段加载,比如先设置每次加载数据10条,当用户滑动ListView到底部的时候,我们再加载20条数据出来,然后使用Adapter刷新ListView,这样用户只需要等待10条数据的加载时间,这样也可以缓解一次性加载大量数据而导致OOM崩溃的情况。

优化方式四:

  • 使用分页加载

  上面第三种方式其实也不能完全解决OOM崩溃的情况,因为虽然我们在分段中一次只增加10条数据到List集合中,然后再刷新到ListView中去,假如有10万条数据,如果我们顺利读到最后这个List集合中还是会累积海量条数的数据,还是可能会造成OOM崩溃的情况,这时候我们就需要用到分页,比如说我们将这10万条数据分为1000页,每一页100条数据,每一页加载时都覆盖掉上一页中List集合中的内容,然后每一页内再使用分批加载,这样用户的体验就会相对好一些。

ListView的四种优化方式相关推荐

  1. 三种快排及四种优化方式

    本文是转载文章,文章的来源:csdn博客 博主:silentsharer 文章: 三种快排及四种优化方式 博文地址:https://blog.csdn.net/hacker00011000/artic ...

  2. php xml 四种,xml中常见的四种解析方式是什么?

    xml解析方式有:1.DOM解析方法,可以对xml文档进行修改操作:2.SAX解析方法,解析速度快,占用内存少:3.JDOM解析方法,查找方便:4.DOM4J解析方法,解析XML的速度快. 在XML的 ...

  3. Java的四种引用方式

    Java的四种引用方式 java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括   强引用,软引用,弱引用,虚引用 Jav ...

  4. it有啥好咨询的_蓝盟浅析,IT外包的四种常用方式

    IT外包服务主要分为IT运维外包和软件开发外包,对于软件开发外包主要偏于研发类型,在本文中主要讨论IT运维外包. 上海蓝盟认为,IT运维外包主要包含IT服务外包.IT采购.弱电工程.系统集成和云服务等 ...

  5. oracle 两种优化器,Oracle的优化器有两种优化方式(一)

    Oracle的优化器有两种优化方式(整理), 2010-04-13 RBO方式:基于规则的优化方式(Rule-Based Optimization,简称为RBO)  优化器在分析SQL语句时,所遵循的 ...

  6. 线程池概念、线程池作用、线程池的四种创建方式

    线程池 1.1.什么是线程池? 线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程.线程池中线程的数量通常完全取决于可用内存数量和应用程 ...

  7. JAVA四种引用方式

    JAVA四种引用方式: java.lang.ref: 强引用(直接变量赋值) 软引用(SoftReference): 只有在要发生OOM错误之前才会回收掉老的软引用对象,应用场景主要防止内存溢出.(缓 ...

  8. 矩阵乘法的四种理解方式

    先介绍向量的两种运算,一个行向量乘以一个列向量称作向量的内积,又叫作点积,结果是一个数: 一个列向量乘以一个行向量称作向量的外积,外积是一种特殊的克罗内克积,结果是一个矩阵, 假设和b分别是一个行向量 ...

  9. 【Android】android开发之splash闪屏页的四种实现方式,启动页的实现教程。

    2019独角兽企业重金招聘Python工程师标准>>> 作者:程序员小冰,GitHub主页: https://github.com/QQ986945193 新浪微博:http://w ...

最新文章

  1. JVM内存模型及垃圾收集策略解析(一)
  2. swift建立桥接_在Swift中建立Alexa技能
  3. 探讨 | 深入探讨Redis管道
  4. centos/redhat破解账号密码
  5. 父类指针指向子类对象,子类指针不能指向父类对象
  6. PAT (Basic Level) Practice1013 数素数
  7. C++11 之for 新解
  8. 如何找到Google浏览器扩展程序在本地文件夹中的位置?
  9. php修改头像接口,php如何修改头像?
  10. js获取html的ip,JavaScript获取客户端IP
  11. Mahony 互补滤波算法
  12. 基于51单片机的对讲机原理图PCB程序设计
  13. JAVA数据结构之Map和Set
  14. 京东商品长图功能来啦 不用改图一键生成长图
  15. c# ASCII转换,数字转字母,字母转数字
  16. FL Studio2020中文版下载安装激活教程及优缺点介绍
  17. 启用window10专业版系统自带的远程桌面
  18. ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)的解决方法。
  19. MySQL 提问的技巧
  20. s_gets()函数解析

热门文章

  1. vue中点击加号_vue 组件之间事件触发($emit)与event Bus($on)的用法说明
  2. qt 焦点捕获_QT 获取菜单焦点__insertItem_QPushButton_setGeometry_焦点_菜单__169IT.COM
  3. outlook 2003 邮件正文中的图片显示为红叉
  4. 微信小程序原生开发功能合集六:富文本组件的封装
  5. studio one 5|preSonus studio one pro 5(音乐制作软件) v5.1.0
  6. 获取并播放youtube data视频
  7. 招标 | 近期隐私计算项目招标中标25(大连理工大学、中国电信北京研究院、松山湖材料实验室、北京控制工程研究所、光大永明)
  8. 基于flask的看图猜成语小程序
  9. 新一年最期望在公司从事哪些工作
  10. 二、进程管理(一)进程与线程