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优化方案和原理,你都知道了嘛?相关推荐

  1. ListView流畅度翻倍!Flutter卡顿分析和优化方案

    最近因为在做Flutter中相关的性能优化,在收集很多性能数据之后发现ListView组件在一些场景下(例如加载更多)容易引起页面卡顿,看到了闲鱼的Flutter 高性能.多功能的全场景滚动容器.但奈 ...

  2. 人人都能掌握的Java服务端性能优化方案

    转载自 人人都能掌握的Java服务端性能优化方案 作为一个Java后端开发,我们写出的大部分代码都决定着用户的使用体验.如果我们的代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响 ...

  3. 直通车运营 直通车扣费原理 直通车优化方案,直通车深度解析

    直通车运营 直通车扣费原理 直通车优化方案,直通车深度解析 今天我们要讲的是怎样将质量得分提高到10分,这也是开直通车需要学习的内容之一.首先需要了解直通车,才能更好的去做优化. 一.直通车的扣费原理 ...

  4. 性能优化一生之敌!耗时3月吃透阿里性能优化方案感觉头都秃了!

    众所周知,阿里巴巴的性能优化超级强,他们也有很多套自己独特的优化方案,这位大佬从阿里P8(9年的开发经验)离职后,带出来了这份Alibaba内部的Java程序性能优化核心笔记,内容涵盖了设计优化.Ja ...

  5. Android优化系列之ListView优化老生常谈

    本文内容:adapter,listview的优化,RecycleBi,google大会推荐优化, 实现ListView的过程,Adapter起到了至关重要的作用,不仅仅因为getview()方法.那么 ...

  6. Android App罕见错误和优化方案

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 1.App如果被定义一个有参数构造函数,那么需要再定义一个无参数的,如果不则会在某些情况下初始化失败 ...

  7. php多表查询性能优化,MSSQL_SQL Server多表查询优化方案集锦,SQL Server多表查询的优化方案是 - phpStudy...

    SQL Server多表查询优化方案集锦 SQL Server多表查询的优化方案是本文我们主要要介绍的内容,本文我们给出了优化方案和具体的优化实例,接下来就让我们一起来了解一下这部分内容. 1.执行路 ...

  8. RecyclerView使用 及 滑动时加载图片优化方案

    RecyclerView使用 及 滑动时加载图片优化方案 简述 本篇博文主要给大家分享关于RecyclerView控件的使用及通过继承RecyclerView来实现滑动时加载图片的优化方案,也同样能解 ...

  9. 史上最全Android性能优化方案解析

    Android中的性能优分为以下几个方面: 布局优化 网络优化 安装包优化 内存优化 卡顿优化 启动优化 -- 一.布局优化 布局优化的本质就是减少View的层级.常见的布局优化方案如下: 在Line ...

  10. Android应用优化方案三

    Android应用优化方案一 点击进入 Android应用优化方案二 点击进入 Android应用优化方案三 布局优化 布局优化的思想很简单,尽量减少布局的层级,布局层级减少绘制时间就会跟着减少,从而 ...

最新文章

  1. 只要5分钟用数据可视化带你看遍11月份新闻热点事件
  2. 小数型 Float(M,D),decimal(M,D)
  3. 在IIS上搭建WebSocket服务器(三)
  4. Tween 若干年后我尽然还要学数学 曲线到底是什么鬼啊
  5. windows server 2003 r2 64位web服务器安装配置注意事项
  6. 用C#抓取AJAX页面的内容
  7. 谷歌逐步取消对IE6的支持
  8. 程序员的职业素养文摘
  9. (30)Gulp 文件操作
  10. 春晚鬼畜 B 站日排行最高,赵本山:我的时代还没有结束!
  11. 【linux,跟Java初学者分享几点经验
  12. base64编码在silverlight中的使用
  13. sht30温湿度传感器中文手册_DHT11温湿度传感器编程思路以及代码的实现
  14. 必应缤纷桌面产品分析
  15. html5家谱制作模板,Word如何做家谱世系图?
  16. [swift] UIImage NSImage PNG透明区域填充自定义颜色实现
  17. php 5.0入门系列教程 pdf,ThinkPHP5.0-快速入门手册(新手教程版).pdf
  18. 骗的就是你!揭露买本10大愚蠢表现
  19. 偏微分方程的matlab解法微盘,偏微分方程的MATLAB解法--陆君安.pdf
  20. 重要信息通知短信解决方案

热门文章

  1. 【三维目标检测】PointRCNN(二)
  2. 【python】爬虫入门书籍推荐
  3. Java实现自动映射原生JDBC查询出的数据库字段
  4. python数学建模|综合评价方法
  5. 【线性代数(9)】矩阵的秩
  6. 16位CRC校验算法
  7. COSMOS/DesignSTAR.v4.5 1CD
  8. .NET简谈分层架构思想(彻底分离每个层)
  9. C语言经典100例-6
  10. matlab 多项式画图,matlab多项式画图