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. 第一次使用mpvue的小记

    ​ 昨晚睡前打开了半个月没打开的知乎, 看到了一个专栏文章再见jquery,我的老朋友,突然想到之前github传出,github已经彻底删除jquery,这似乎标志着前端已经完全进入了一个新的时代, ...

  2. 我的Tmux学习笔记

    0. 修改指令前缀 // ~/.tmux.conf ubind C-b set -g prefix C-a 1. 新建会话 tmux tmux new -s session-name // 可以设置会 ...

  3. php源码建博客5--建库建表-配置文件-错误日志

    主要: 整理框架 建库建表 配置文件类 错误日志记录 --------------本篇后文件结构:-------------------------------------- blog ├─App │ ...

  4. IDELPHI是一个MIS系统初学者的乐园空间

    DELPHI的长处之一是MIS系统,此空间介绍了MIS中种种问题,及使用DELPHI XE做的办法. 为什么选择DELPHI? DELPHI是开发效率很高的一个工具,但也许很多人都喜欢选择微软.NET ...

  5. MapReduce序列化及分区的java代码示例

    概述 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化的逆过程.把字节流转为结构化对象. 当要在进程间传递对象或持久化对象的时候, ...

  6. angularjs transitions

    http://angular-transitions.mgechev.com/#/view/page1 https://scotch.io/tutorials http://stackoverflow ...

  7. 武汉Uber优步司机奖励政策(1月11日~1月17日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. 苏州Uber优步司机奖励政策(3月28日~3月30日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. CLR via c#读书笔记九:字符、字符串和文本处理

    1.在.NET Framework中,字符总是表示成16位unicode代码值(关于unicode.utf8等可以到http://www.ruanyifeng.com/blog/2007/10/asc ...

  10. myeclipse 配置堆内存

    2.非堆内存分配 JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64:由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4. 打开myeclipse ...