ListView的运行效率是比较低的,因为在getView()中每次都会将整个布局重新加载一遍,当ListView快速滚动的时候就会成为性能瓶颈。

  调用View中的findViewById()方法获取一次控件的实例,这也是一个很耗时的操作,可以进行优化。

方法一:convertView参数

  这个参数用于将之前加载好的布局进行缓存,以便之后进行重用。

    @Override
public View getView(int position, View convertView, ViewGroup parent)
{
if(convertView == null)
{
convertView = inflater.inflate(R.layout.item, null);
}
ImageView logo = (ImageView)convertView.findViewById(R.id.logo);
TextView title = (TextView)convertView.findViewById(R.id.title);
TextView version = (TextView)convertView.findViewById(R.id.version);
TextView size = (TextView)convertView.findViewById(R.id.size); logo.setImageResource((Integer)list.get(position).get("logo"));
title.setText((String)list.get(position).get("title"));
version.setText((String)list.get(position).get("version"));
size.setText((String)list.get(position).get("size")); Button btn = (Button)convertView.findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("dou", "点击");
}
});
return convertView;
}

  使用这个参数用于将之前加载好的布局进行缓存,以便之后进行重用。

  在getView()方法进行判断,如果为空,则使用LayoutInflater去加载布局,如果不为空,则直接对convertView进行重用,这样可以提高ListView的运行效率,在快速滚动的时候也可以表现出更好的性能。

  

方法二:ViewHolder进行优化

 public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
if(convertView == null)
{
convertView = inflater.inflate(R.layout.item, null);
holder = new ViewHolder();
holder.logo = (ImageView)convertView.findViewById(R.id.logo);
holder.title = (TextView)convertView.findViewById(R.id.title);
holder.version = (TextView)convertView.findViewById(R.id.version);
holder.size = (TextView)convertView.findViewById(R.id.size);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder)convertView.getTag();
}
holder.logo.setImageResource((Integer)list.get(position).get("logo"));
holder.title.setText((String)list.get(position).get("title"));
holder.version.setText((String)list.get(position).get("version"));
holder.size.setText((String)list.get(position).get("size")); Button btn = (Button)convertView.findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("dou", "点击");
}
});
return convertView;
} class ViewHolder
{
ImageView logo;
TextView title;
TextView version;
TextView size;
}

  当convertView为空的时候:创建一个ViewHolder对象,并将对象的实例都存放在ViewHolder中,然后调用setTag()方法,将ViewHoler对象存储在View中。

  当convertView不为空的时候:调用View的getTag()方法,将ViewHolder重新取出来。

  

  1.viewHolder是一个自定义的类,它存储了通过findViewById获取的空间对象;

  2.当ConvertView被新建时,ViewHolder也随之一起缓存到Recycler中;

  3.当ConvertView被重新利用的时候,ViewHolder也随之取出,从而可以直接给各个控件赋值,而无需再次调用findViewById方法。

  结论:

    无论总量是多少,findViewById方法最多可以调用N+1组(N为一屏可以显示的item的数量)

  通过ViewHolder的方法,可以将所有的控件进行缓存,不需要每次通过findViewById来获取控件实例。

android入门 — ListView的优化的更多相关文章

  1. ym——Android之ListView性能优化

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android之ListView性能优化 假设有看过我写过的15k面试题的朋友们一定知 ...

  2. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

  3. android入门 — ListView

    ListView主要是用来解决大量数据展示的问题,它的用途很广泛,几乎所有的app都会用到,比如说知乎.今日头条.微博.通讯录等. ListView允许用户通过上下滑动的方式将屏幕外的数据滚动到屏幕中 ...

  4. Android之ListView/GridView 优化

    一.效率最低的getView实现 我们知道,ListView和GridView的显示都是通过Adapter的getView实现的. ListView/GridView数据量较小时,我们的处理方式一般是 ...

  5. Android 开发ListView适配器优化

    我们都知道Android中Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View.想过没有? 在我们的列 ...

  6. Android之ListView性能优化

    ListView滚动速度优化主要可以应用以下几点方法来实现: 1.使用Adapter提供的convertView convertView是Adapter提供的视图缓存机制,当第一次显示数据的时候,ad ...

  7. Android之ListView性能优化——使用ConvertView和ViewHolder

    使用ConvertView和ViewHolder的优化是针对ListView的Adapter(BaseAdapter)的.这种优化的优点如下: 1)重用了ConveertView,在很大程度上减少了内 ...

  8. android入门 — ListView点击事件

    listView中提供了两种点击事件的处理方法,分别是OnItemClick和OnItemLongClick. OnItemClick提供的是点击操作的处理,OnItemLongClick提供的是长按 ...

  9. Android中ListView的优化

    第一种方法 重用了convertView,很大程度上的减少了内存的消耗.通过判断convertView是否为null,是的话就需要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给 ...

随机推荐

  1. C#获取本地磁盘信息

    直接上干货简单易懂 //磁盘监控(远程/本地) //需要引用System.Management.dll public class RemoteMonitoring { private static s ...

  2. Hive(4)-Hive的数据类型

    一. 基本数据类型 Hive数据类型 Java数据类型 长度 例子 TINYINT byte 1byte有符号整数 20 SMALINT short 2byte有符号整数 20 INT int 4by ...

  3. aes并发加密Cipher not initialized 异常

    javax.crypto.Cipher 每次都要实例化,大量的实例化导致 Cipher 实例化失败. 解决办法:将已经实例化的Cipher对象,放在hashmap中,每次实例化的时候从MAP 获取,不 ...

  4. JZ2440开发板:UART(串口)使用(学习笔记)

    查看UART在硬件上的信息,阅读JZ2440原理图可以看到: JZ2440开发板的UART0是可以跟USB相接的,用于打印调试,UART1,UART2两个串口用来外接模块.所以本文仅对UART0进行操 ...

  5. Python前戏

    1.Python解释器 官网:https://www.python.org/getit/ 因为Python的3.0和2.0版本有所差别,所以根据个人学习方向分别下载安装. 安装验证:打开命令提示符,执 ...

  6. 20145202马超 2016-2017-2 《Java程序设计》第11周学习总结

    20145202马超 2016-2017-2 <Java程序设计>第11周学习总结 教材学习内容总结 XX 教材学习中的问题和解决过程 教材学习有问题先去https://shimo.im/ ...

  7. bbblack的网络socket通信实验

    1. 本次用bbblack作网络的通信实验,对了,这个板子必须装SD卡才能启动吗?板载的4GB eMMC Flash 存储器,eMMC (Embedded Multi Media Card) 为MMC ...

  8. linux 解压命令大全[转]

    本文转自:  http://www.cnblogs.com/eoiioe/archive/2008/09/20/1294681.html .tar 解包:tar xvf FileName.tar打包: ...

  9. nginx 路由配置

    nginx中location对url匹配: 语法:location [=|~|~*|^~] /uri/ { … } 当匹配中符合条件的location,则执行内部指令:如果使用正则表达式,必须使用~* ...

  10. cf#516B. Equations of Mathematical Magic(二进制,位运算)

    https://blog.csdn.net/zfq17796515982/article/details/83051495 题意:解方程:a-(a^x)-x=0 给出a的值,要求计算解(非负)的个数 ...