ListView优化方案和原理,你都知道了嘛?
1.重用ConvertView
ListView的View回收机制:在可视范围上面或者下面的View加入到回收池中。当在可视范围内的View被移出可视范围内时,其也会被添加到回收池中。以这种方式ListView只需占用非常少的内存几可以存储可视范围内的View和回收池中的View。
参数convertView实际上就是一个可回收的View。当ListView要回收这个View的时候,它的数据就会被清空。因此,当convertView不为null的时候,只需要将数据填充到里面,而不用Inflate一个新的View,这样可以优化性能。因为,Layout的Inflate是消耗资源巨大的代码,因为Infalte操作需要彻底包含整个XML代码树,而且还要实例化相应的View。
public View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = mInflater.inflate(R.layout.your_layout, null);}TextView text = (TextView) convertView.findViewById(R.id.text);text.setText("Position " + position);return convertView;}
2.使用ViewHolder
ViewHolder就是用来存储那些在你的getView()方法中调用findViewById()方法得到的View。以这种方式,你只需要在第一次创建Item的时候调用findViewById就可以了。
public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = mInflater.inflate(R.layout.your_layout, null);holder = new ViewHolder();holder.text = (TextView) convertView.findViewById(R.id.text);convertView.setTag(holder);} else {holder = convertView.getTag();}holder.text.setText("Position " + position);return convertView;}private static class ViewHolder {public TextView text;}
3.异步加载
加载图片是一个比较耗时的操作,当用户快速滑动列表时,会频繁地 getView ,而 getView 是在主线程中被调用的,如果你在 getView 方法中直接加载 Image 或做其他耗时操作,就会造成滑动比较卡,解决方法是使用异步加载。
ListView加载图片乱序问题的解决方法:
getView中setTag,可以是图片的url等唯一标识
异步加载后,为ImageView设置图片之前,用findVIewWithTag查找tag是不是为null,不是null才设置图片
其他优化方法:
adapter的getView方法中尽可能的减少耗时的操作,getView方法执行的时间只有很短,否则会卡顿。
数据分页分批次加载
快速滑动时不要加载图片,否则会卡顿,如果在滑动时对滑动过的每张图片都要加载,会比较占内存。设置滚动监听,滚动的时候不要加载图片。
尽可能减少ListView的Item的Layout层次(如可以使用RelativeLayout替换LinearLayout,或使用自定的View代替组合嵌套使用的Layout)
onClickListener
,当ListView的item中有比如button这些子view时,需要对其设置onclickListener,通常的写法是在getView方法中一个个设置,比如holder.img.setonClickListener(new onClickListenr)...
但是这种写法每次调用getView时都设置了一个新的onClick事件,都需要new 监听器,效率很低。高效的写法可以直接在ViewHolder中设置一个position,然后viewHolder implements OnClickListenr:
class ViewHolder implements OnClickListener{int position;TextView name;public void setPosition(int position){this.position = position;}@Overridepublic void onClick(View v) {switch (v.getId()){//XXXX}} }public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {convertView = inflater.inflate(R.layout.list_item, parent, false);holder = new ViewHolder();holder.name = (TextView) convertView.findViewById(R.id.name);holder.name.setOnClickListener(holder);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}//设置holderholder.name.setText(list.get(position).partname);//设置positionholder.setPosition(position);return convertView; }
参考:
https://blog.csdn.net/u014657752/article/details/47379941
https://www.zhihu.com/question/19703384
https://blog.csdn.net/guolin_blog/article/details/45586553
ListView优化方案和原理,你都知道了嘛?相关推荐
- ListView流畅度翻倍!Flutter卡顿分析和优化方案
最近因为在做Flutter中相关的性能优化,在收集很多性能数据之后发现ListView组件在一些场景下(例如加载更多)容易引起页面卡顿,看到了闲鱼的Flutter 高性能.多功能的全场景滚动容器.但奈 ...
- 人人都能掌握的Java服务端性能优化方案
转载自 人人都能掌握的Java服务端性能优化方案 作为一个Java后端开发,我们写出的大部分代码都决定着用户的使用体验.如果我们的代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响 ...
- 直通车运营 直通车扣费原理 直通车优化方案,直通车深度解析
直通车运营 直通车扣费原理 直通车优化方案,直通车深度解析 今天我们要讲的是怎样将质量得分提高到10分,这也是开直通车需要学习的内容之一.首先需要了解直通车,才能更好的去做优化. 一.直通车的扣费原理 ...
- 性能优化一生之敌!耗时3月吃透阿里性能优化方案感觉头都秃了!
众所周知,阿里巴巴的性能优化超级强,他们也有很多套自己独特的优化方案,这位大佬从阿里P8(9年的开发经验)离职后,带出来了这份Alibaba内部的Java程序性能优化核心笔记,内容涵盖了设计优化.Ja ...
- Android优化系列之ListView优化老生常谈
本文内容:adapter,listview的优化,RecycleBi,google大会推荐优化, 实现ListView的过程,Adapter起到了至关重要的作用,不仅仅因为getview()方法.那么 ...
- Android App罕见错误和优化方案
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 1.App如果被定义一个有参数构造函数,那么需要再定义一个无参数的,如果不则会在某些情况下初始化失败 ...
- php多表查询性能优化,MSSQL_SQL Server多表查询优化方案集锦,SQL Server多表查询的优化方案是 - phpStudy...
SQL Server多表查询优化方案集锦 SQL Server多表查询的优化方案是本文我们主要要介绍的内容,本文我们给出了优化方案和具体的优化实例,接下来就让我们一起来了解一下这部分内容. 1.执行路 ...
- RecyclerView使用 及 滑动时加载图片优化方案
RecyclerView使用 及 滑动时加载图片优化方案 简述 本篇博文主要给大家分享关于RecyclerView控件的使用及通过继承RecyclerView来实现滑动时加载图片的优化方案,也同样能解 ...
- 史上最全Android性能优化方案解析
Android中的性能优分为以下几个方面: 布局优化 网络优化 安装包优化 内存优化 卡顿优化 启动优化 -- 一.布局优化 布局优化的本质就是减少View的层级.常见的布局优化方案如下: 在Line ...
- Android应用优化方案三
Android应用优化方案一 点击进入 Android应用优化方案二 点击进入 Android应用优化方案三 布局优化 布局优化的思想很简单,尽量减少布局的层级,布局层级减少绘制时间就会跟着减少,从而 ...
最新文章
- 只要5分钟用数据可视化带你看遍11月份新闻热点事件
- 小数型 Float(M,D),decimal(M,D)
- 在IIS上搭建WebSocket服务器(三)
- Tween 若干年后我尽然还要学数学 曲线到底是什么鬼啊
- windows server 2003 r2 64位web服务器安装配置注意事项
- 用C#抓取AJAX页面的内容
- 谷歌逐步取消对IE6的支持
- 程序员的职业素养文摘
- (30)Gulp 文件操作
- 春晚鬼畜 B 站日排行最高,赵本山:我的时代还没有结束!
- 【linux,跟Java初学者分享几点经验
- base64编码在silverlight中的使用
- sht30温湿度传感器中文手册_DHT11温湿度传感器编程思路以及代码的实现
- 必应缤纷桌面产品分析
- html5家谱制作模板,Word如何做家谱世系图?
- [swift] UIImage NSImage PNG透明区域填充自定义颜色实现
- php 5.0入门系列教程 pdf,ThinkPHP5.0-快速入门手册(新手教程版).pdf
- 骗的就是你!揭露买本10大愚蠢表现
- 偏微分方程的matlab解法微盘,偏微分方程的MATLAB解法--陆君安.pdf
- 重要信息通知短信解决方案