ListView的四种优化方式
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效率要高一点?
需要用到两个方法:setTag
和getTag
方法:
@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的四种优化方式相关推荐
- 三种快排及四种优化方式
本文是转载文章,文章的来源:csdn博客 博主:silentsharer 文章: 三种快排及四种优化方式 博文地址:https://blog.csdn.net/hacker00011000/artic ...
- php xml 四种,xml中常见的四种解析方式是什么?
xml解析方式有:1.DOM解析方法,可以对xml文档进行修改操作:2.SAX解析方法,解析速度快,占用内存少:3.JDOM解析方法,查找方便:4.DOM4J解析方法,解析XML的速度快. 在XML的 ...
- Java的四种引用方式
Java的四种引用方式 java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括 强引用,软引用,弱引用,虚引用 Jav ...
- it有啥好咨询的_蓝盟浅析,IT外包的四种常用方式
IT外包服务主要分为IT运维外包和软件开发外包,对于软件开发外包主要偏于研发类型,在本文中主要讨论IT运维外包. 上海蓝盟认为,IT运维外包主要包含IT服务外包.IT采购.弱电工程.系统集成和云服务等 ...
- oracle 两种优化器,Oracle的优化器有两种优化方式(一)
Oracle的优化器有两种优化方式(整理), 2010-04-13 RBO方式:基于规则的优化方式(Rule-Based Optimization,简称为RBO) 优化器在分析SQL语句时,所遵循的 ...
- 线程池概念、线程池作用、线程池的四种创建方式
线程池 1.1.什么是线程池? 线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程.线程池中线程的数量通常完全取决于可用内存数量和应用程 ...
- JAVA四种引用方式
JAVA四种引用方式: java.lang.ref: 强引用(直接变量赋值) 软引用(SoftReference): 只有在要发生OOM错误之前才会回收掉老的软引用对象,应用场景主要防止内存溢出.(缓 ...
- 矩阵乘法的四种理解方式
先介绍向量的两种运算,一个行向量乘以一个列向量称作向量的内积,又叫作点积,结果是一个数: 一个列向量乘以一个行向量称作向量的外积,外积是一种特殊的克罗内克积,结果是一个矩阵, 假设和b分别是一个行向量 ...
- 【Android】android开发之splash闪屏页的四种实现方式,启动页的实现教程。
2019独角兽企业重金招聘Python工程师标准>>> 作者:程序员小冰,GitHub主页: https://github.com/QQ986945193 新浪微博:http://w ...
最新文章
- JVM内存模型及垃圾收集策略解析(一)
- swift建立桥接_在Swift中建立Alexa技能
- 探讨 | 深入探讨Redis管道
- centos/redhat破解账号密码
- 父类指针指向子类对象,子类指针不能指向父类对象
- PAT (Basic Level) Practice1013 数素数
- C++11 之for 新解
- 如何找到Google浏览器扩展程序在本地文件夹中的位置?
- php修改头像接口,php如何修改头像?
- js获取html的ip,JavaScript获取客户端IP
- Mahony 互补滤波算法
- 基于51单片机的对讲机原理图PCB程序设计
- JAVA数据结构之Map和Set
- 京东商品长图功能来啦 不用改图一键生成长图
- c# ASCII转换,数字转字母,字母转数字
- FL Studio2020中文版下载安装激活教程及优缺点介绍
- 启用window10专业版系统自带的远程桌面
- ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)的解决方法。
- MySQL 提问的技巧
- s_gets()函数解析
热门文章
- vue中点击加号_vue 组件之间事件触发($emit)与event Bus($on)的用法说明
- qt 焦点捕获_QT 获取菜单焦点__insertItem_QPushButton_setGeometry_焦点_菜单__169IT.COM
- outlook 2003 邮件正文中的图片显示为红叉
- 微信小程序原生开发功能合集六:富文本组件的封装
- studio one 5|preSonus studio one pro 5(音乐制作软件) v5.1.0
- 获取并播放youtube data视频
- 招标 | 近期隐私计算项目招标中标25(大连理工大学、中国电信北京研究院、松山湖材料实验室、北京控制工程研究所、光大永明)
- 基于flask的看图猜成语小程序
- 新一年最期望在公司从事哪些工作
- 二、进程管理(一)进程与线程