重用 ListView Item

ListView创建时其会创建屏幕可容纳数量的 Item。ListView 滚动时,刚消失的 item 会被保存到回收池中。新出现的 item 从回收池中获取避免反复创建,这个回收池由 ListView 维护。

从回收池取出 item 会传递给 Adapter 的 getView() 方法的第二个參数。假设回收池中没有内容就传递一个 null。所以在 getView() 方法中假设第二个參数不为 null,就重用传入的 ListView Item。这能够极大的提高 ListView 性能。

public void getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
// 创建新的 ListView item
view = LayoutInflator.from(mContext).inflate(...);
} /* 更新 ListView Item */
TextView textView = (TextView)view.findViewById(R.id.textview);
textView.setText("new data"); return view;
}

使用ViewHold中避免每次调用findViewById()

使用上面重用 ListView Item 的方法已经能够大幅提高 ListView 的效率了,但还存在一些能够改进的地方,上面每次更新 ListView Item 数据时,都要通过 View 的 findViewById() 方法定位每一个子控件, findViewById() 会沿着ListView Item 的控件布局结构遍历每一个控件直到找到指定 id 的控件,这是比較耗时的,尤其是布局比較复杂时。

优化方法非常easy,在每次创建新的 ListView Item 时保存通过 findViewById() 找到的每一个子控件的引用。这些控件引用能够保存在一个单独的对象中。一般命名为 ViewHolder,然后将 ViewHolder 对象存储在 ListView item 中(通过 View 的 setTag() 方法。该方法能够在 View 中存储额外数据)。下次能够直接从 ListView item 中取得。

public void getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
// 创建新的 ListView item
view = LayoutInflator.from(mContext).inflate(...);
// 保存控件引用在 ViewHolder 对象中
ViewHolder holder = new ViewHolder();
holder.textView = (TextView)view.findViewById(R.id.textview);
// 将 ViewHolder 对象保存在 ListView Item 中
view.setTag(holder);
} /* 更新 ListView Item */
ViewHolder holder = (ViewHolder)view.getTag();
holder.textView.setText("new data"); return view;
} private static class ViewHolder {
public TextView textView;
}

固定ListView Item的大小

因为 ListView 高度或宽度不固定(布局參数中的宽或高指定为 wrap_content),导致 ListView 重绘时须要又一次计算 ListView Item 的大小,从而导致 getView() 方法反复调用(这里是指针对同一个ListView item)。这对 ListView 的性能有显著的影响,解决的方法就是指定 ListView 布局參数中的高和宽为固定大小或 match_parent。

避免更新同样数据

当 ListView Item 中包括图片控件时, 在 getView() 中更新数据通常是依据图片的 URI 取得 Bitmap 然后设置图片。假设 ImageView 显示的图片地址和要更新的图片地址同样,就全然没有必要做更新操作。

能够採用和 ViewHolder 同样的方式。将图片的 URI 地址保存在 ImageView 的 tag 中,每次更新 ImageView 时先推断图片地址是否发生变化,仅仅有发生变化时採取获取新的 Bitmap 更新。

String newImgUrl = ...;
String imgUrl = (String)imageView.getTag();
if (imageUrl == null || !imageUrl.equal(newImgUrl)) {
// 请求 newImgUrl 相应的图片
Bitmap bitmap = ...;
imageView.setImageBitmap(bitmap);
imageView.setTag(newImgUrl);
}

限制 ListView 的滚动速度

ListView 默认的滚动速度是比較快的,假设 ListView 滚动速度慢一点,那么每一个 ListView Item 就有很多其它的载入时间。这也能够使 ListView 看上去更加流畅。

以下代码将 ListView 的滚动速度减慢为原来的 1/10:

listview.setFriction(ViewConfiguration.getScrollFriction() * 10);

【Android】ListView 优化的更多相关文章

  1. android ListView优化

    android ListView通过优化重用历史缓存实现.listview相应的数据适配器一般使用自己定义BaseAdapter子类,重用历史缓冲区来提高性能. 例如,下面的示例代码演示: 1.lis ...

  2. Android——ListView优化

    1.ListView基本概念 列表显示需要三个元素: ListView:用来展示列表的View. 适配器:用来把数据映射到ListView上 数据:具体的将被映射的字符串,图片或基本组件 适配器类型分 ...

  3. android listview优化:滑动时颜色错乱问题

      最近android的listview写多了,也学习了各种listview的优化,列如viewHolder的使用.今天做item颜色设置时遇到一个新的问题.我这里设置“未完成”是灰色的,“已完成”是 ...

  4. android listview 优化

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha android convertview作用 ======= 1,convertView复 ...

  5. listview优化 汇总

    1,listview加载性能优化ViewHolder 转自: http://blog.csdn.net/jacman/article/details/7087995 在android开发中Listvi ...

  6. android ListView的介绍和优化

    xml设计 <?xml version="1.0"?> -<RelativeLayout tools:context=".MainActivity&qu ...

  7. Android listview 的优化

    接[Android listview的应用][1] 在我们上一篇[Android listview的应用][1]中,我们的adapter中的getView()方法中每次都将布局重新加载一遍,这样就会导 ...

  8. Android性能优化之Listview(ViewHolder重用机制)

    相信大家在很多时候都会用到ListView这个控件,因为确实是用的很多很多,但是有木有遇到过当数据很多很多的时候,往下滑ListView时有时候会卡顿,这就需要我们来优化它了. ListView优化主 ...

  9. Android 常驻与很驻型广播的差别,及ListView优化,Android新手基本知识巩固

    1.常驻型广播  常驻型广播,当你的应用程序关闭了,假设有广播信息来,你写的广播接收器相同的能接受到.  他的注冊方式就是在你的应用程序中的AndroidManifast.xml进行注冊. 通常说这样 ...

  10. Android性能优化之提高ListView性能的技巧

    ListView优化一直是一个老生常谈的问题.无论是面试还是寻常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看怎样最大化的优化ListView的性能. 1.在adapter中的ge ...

随机推荐

  1. Java系列学习(十一)-内部类

    1.内部类 (1)把类定义在另一个类的内部,该类就称为内部类 (2)内部类的访问规则 A:内部类可以直接访问外部类的成员,包括私有 B:外部类要想访问内部类的成员,必须创建对象 (3)内部类的分类 A ...

  2. Java常用类库(二):Iterator迭代器和子范围视图

    今天介绍集合类的以下内容: l  Iterator迭代器 l  子范围视图简介 Iterator迭代器: 应该将java迭代器认为是位于两个元素之间, 当调用next 时,迭代器就越过下一个元素,并返 ...

  3. android中textview单行显示,多余的省略

    <TextView android:id="@+id/music_title" android:layout_width="wrap_content" a ...

  4. jQuery制作顶部与左侧锚点板块定位功能带动画跳转特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. html5——拖拽

    基本情况 在HTML5的规范中,我们可以通过为元素增加draggable="true"来设置此元素是否可以进行拖拽操作,其中图片.链接默认是开启的. 拖拽元素 页面中设置了drag ...

  6. 2016.01.07 DOM笔记(二) DOM节点

    node节点属性 nodeName属性 oneBox= document.getElementsById('box');var s = oneBox.nodeName;  //nodeName与tag ...

  7. zabbix配置邮件报警(第四篇)

    zabbix配置邮件报警(第四篇) 邮件报警可采用本地邮件服务,也可以自定义脚本,这里我采用本地邮件服务报警 添加收件人

  8. (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务

    http://blog.csdn.net/zixiao217/article/details/53044890 读完第一节,我们已经对Quartz有了一个大体的认识,它可以定时帮我们执行一些处理程序, ...

  9. excel 类获取起始列和使用列

    m_excel.OpenWorkBook(sFileName, sSheetDrawingList); // Get drawing info int iStartRow = 0, iStartCol ...

  10. 汇编:MSR/MRS/BIC指令

    1.MRS指令MRS指令的格式为:MRS{条件}   通用寄存器,程序状态寄存器(CPSR或SPSR)MRS指令用于将程序状态寄存器的内容传送到通用寄存器中.该指令一般用在以下两种情冴: Ⅰ.当需要改 ...