常用的优化ListView效率的方法及其原理

在Android开发中,ListView的使用频率及其高,可以说99%的应用中你都可以看到他的身影。

在日常的开发工作中,我们一般会通过以下方法来优化ListView的效率:

1.复用getView方法中的convertView

一个ListView可能有很多Item,但是限于手机屏幕非常有限,所以只能显示很少的一部分Item,比如能显示10个,那么Android会在ListView中保存多余10个的Item,

溢出屏幕的Item会被回收到一个池子中,以备后用,那么就不用从新new出View对象,这样大大提高了ListView的加载速度。

2.使用ViewHolder模式

在最新的Android5.0中,这种模式已经被RecylerView使用,可见这种模式确实非常有效。

我们来看下ViewHolder的定义:

1 public static class ViewHolder{
2    public TextView texView;
3    public ImageView imageView;
4    public LinearLayout linearLayout;
5    ........
6 }

ViewHolder中保存的都是View对象,这样避免了当我们可以复用converView的时候,需要使用convertView.findViewById来查找View,
这种查找的过程随着布局层次的加深会有性能上的消耗。

3.使用异步

在ListView中我们要避免耗时操作,最常见的就是加载图片。这个可以用单独的篇幅来讨论,这里就不多写了。

4.优化converView的布局

ListView中有很多Item,每个Item的绘制、测量、布局都需要消耗时间,这样会导致View的加载效率很低,所以应该避免嵌套层次过多。

5.如果界面需要非常频繁的更新,可以控制更新的频率和更新特定的Item

  我们知道,如果ListView使用Adapter中数据有变化,我们会调用Adapter.notifyDataSetChanged方法来刷新界面,但是这个方法会刷新所有Item,但有的时候这不是我们想要的。

比如,我们在做一个下载器,ListView的每个Item都可能收到进度的更新,如果不对更新频率加以控制,那么界面一定会卡死,产生ANR。所以我们必须在通知进度更新的地方,加上频率控制,比如每隔3秒通知UI刷新一次。

  另外,并不是所有的Item都需要刷新,我们没必要去调用Adapter.notifyDataSetChanged方法。在需要刷新的方法中,我们可用通过ListView.getChildAt(int index)方法,获取出当前ListView显示的Item,判断这些Item

哪些是需要更新的,然后设置UI的状态,这样ListView的效率能更进一步的得到提升。

6.在滑动的时候避免加载图片

  这个方法可能不会提高ListView的加载速度,但是会提高用户体验。具体做法是:在ListView滑动的时候,不要发送加载图片的请求,保持你的线程池中的请求队列不会有过多的请求,尤其是用户快速滑动过的Item中要加载的图片,

这样可以保证ListView停止滑动的时候,下载队列中的请求尽可能多的是当前显示给用户的Item中的图片请求。

时间: 2024-12-27 00:07:53

常用的优化ListView效率的方法及其原理的相关文章

android问题及其解决-优化listView卡顿和怎样禁用ListView的fling

问题解决-优化listView卡顿和怎样禁用ListView的fling 前戏非常长,转载请保留出处:http://blog.csdn.net/u012123160/article/details/47720257 问题产生 这算是刚到实习公司接触到的第一个任务.公司某一产品中某个界面的listView高速滑动会有卡顿的现象发生,我的任务就是解决它. 产生原因分析 我一開始的想法比較简单.可能是listview的优化没有做到位,比如convertView的复用.viewHolder的使用等等基础

Android性能优化--Listview优化

ListView的工作原理 首先来了解一下ListView的工作原理(可参见http://mobile.51cto.com/abased-410889.htm),如图: ListView 针对每个item,要求 adapter “返回一个视图” (getView),也就是说ListView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到ListView的长度,然后根据这个长度,调用getView()一行一行的绘制ListView的每一项.如果你的getCount()返回

产品经理常用的四种需求收集方法简述

A 客户访谈 客户访谈是通过面对面的交流方式了解具体客户对产品.对流程的需求.观点和看法. 客户访谈的内容可以包括: 1.了解哪些需求对客户比较重要. 2.就了解到的一些需求请客户协助进行优先排序. 3.就问题改进建议的初步想法与客户进行讨论,确认是否能够满足客户需求. 客户访谈的优点包括: 1.由于是面对面的交流,因此在调查内容上更加灵活,可以随时根据问答状况就一些内容进行深入讨论,获得更多的客户感受. 2.客户可以再调查人的协助下,进行一些较为复杂的问卷调查. 3.客户访谈方式的适用面广,可

Android - ViewHolder优化ListView

在Android开发中, ListView是重要的组件, 它以列表形式根据数据的长度, 自适应展示具体内容. 用户可以自由的定义ListView每一列的布局. 当listview有大量数据需要加载的时候, 会占据内存, 影响性能. 这时候就需要按需填充, 并重新使用View, 减少对象的创建. ListView加载数据都是在getView()方法中进行. 同时, 需要自定义ListView重写ListAdapter: 如BaseAdapter, SimpleAdapter, CursorAdap

arm-linux-gcc 常用参数讲解 gcc编译器使用方法

我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为 arm-linux-gcc.下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家. 在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段: 1. 预处理(Pre-Processing) 2. 编译(Compiling) 3. 汇编(Assembling) 4. 链接(Linking) Linux程序员可以根据自己的需要让 GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或

关于C#程序优化的五十种方法

关于C#程序优化的五十种方法 这篇文章主要介绍了C#程序优化的五十个需要注意的地方,使用c#开发的朋友可以看下 一.用属性代替可访问的字段 1..NET数据绑定只支持数据绑定,使用属性可以获得数据绑定的好处: 2.在属性的get和set访问器重可使用lock添加多线程的支持. 二.readonly(运行时常量)和const(编译时常量) 1.const只可用于基元类型.枚举.字符串,而readonly则可以是任何的类型: 2.const在编译时将替换成具体的常量,这样如果在引用中同时使用了con

优化MYSQL数据库的方法

1.选取最适用的字段属性 尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM 2.使用连接(JOIN)来代替子查询:  a.删除没有任何订单客户 ELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo) b.提取所有没有订单客户 SELECT FROM customerinfo WHERE customerid NOT in(SELECT cust

理解用setTag 和 Viewholder 来优化listView

在说 setTag和getTag之前,我们先说下 Viewholder,它不是Android开发固定的API,而是谷歌Demo中推荐的设计方法.Viewholder对象它一般包括listview子项里所有的组件,convertView是空的,在Viewholder里存储对列表子项每个组件的id应用,通过setTag方法,把这个带有view引用的对象附加在View上,如此,当listView更新的时候,就不用再次去重复寻找引用,并且强制转换等工作,findViewById(R.id.img):通过

Ace教你一步一步做Android新闻客户端(五) 优化Listview

今天写存货了 调试一些动画参数花了些时间 ,嘿嘿存货不多了就没法做教程了,今天来教大家优化listview,等下我把代码编辑下 这次代码有些多 所以我把条理给大家理清楚.思路就是把加载图片的权利交给OnScrollListener . 1 首先来到 NewsAdapter这个类 ,我们给他实现了一个 AbsListView.OnScrollListener 这个接口,这个接口有两个方法: @Override public void onScrollStateChanged(AbsListView