博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Android】ListView 优化
阅读量:6519 次
发布时间:2019-06-24

本文共 2686 字,大约阅读时间需要 8 分钟。

重用 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);

转载于:https://www.cnblogs.com/yutingliuyl/p/7111616.html

你可能感兴趣的文章
php课程---Json格式规范需要注意的小细节
查看>>
hadoop hdfs notes
查看>>
Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
查看>>
(2编写网络)自己动手,编写神经网络程序,解决Mnist问题,并网络化部署
查看>>
手把手教你实现boost::bind
查看>>
【转】如何使用分区助手完美迁移系统到SSD固态硬盘?
查看>>
java~lambda表达式让查询更优雅
查看>>
a标签中的javascript:;是什么
查看>>
关于connect: network is unreachable 问题的解决【转】
查看>>
RxSwift源码与模式分析一:基本类
查看>>
.NET MVC5+ Dapper+扩展+微软Unity依赖注入实例
查看>>
INSTALL_FAILED_USER_RESTRICTED
查看>>
使用 https, 并将 WWW 跳转到 NON-WWW
查看>>
iToolkit,推荐我们自己做的一套前端组件
查看>>
Junit源码阅读(一)
查看>>
JavaScript设计模式与开发实践 | 01 - 面向对象的JavaScript
查看>>
捷信达酒店管理系统使用说明
查看>>
使用java api 创建excel内容并发送邮件
查看>>
Unity3d删除无用的美术资源轻量级插件
查看>>
Linux基础命令---umask
查看>>