欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android ListView常见的优化方式详解

程序员文章站 2023-12-18 09:05:16
listview的优化 对于listview来说,应该算是布局中几种最常用的组件之一了,使用也十分方便,下面个大家介绍一下两种常见的优化方式. 1.条目复用优化...

listview的优化

对于listview来说,应该算是布局中几种最常用的组件之一了,使用也十分方便,下面个大家介绍一下两种常见的优化方式.

1.条目复用优化

  1. 其实listview的工作原理就是,listview在请求屏幕可见的item数时,convertview在getview中是null 的.
  2. 但是当屏幕向下滑动的时候(比如该屏幕尺寸可显示7条teim),在item1被隐藏,此时出现item8时,covertview的值就不为null 了,因为item1去填充它.
  3. 而如果不做复用处理的话,item8 则会继续去findviewbyid, 因此其实每个item里的view控件,竟然id都是一样的,那我们其实可以利用covertview的复用原理,来优化listview,从而避免oom异常.

详情见下图:

总结: 通过对上图的理解,那么我们得知listview的item是可以进行复用的,通过什么来复用?android已经帮我们定义了一个方法getview(final int position, view convertview,viewgroup parent) 里面的convertview 就是专门来处理复用的item的,因此我们只要对他处理就可以了.

2.优化findviewbyid

系统寻找子孩子id的方式: 从左向右,跟树状模式一样.

每次寻找子孩子都消耗很多的资源,但是子孩子的id都是被创建出来的,

也就是是说他们是固定的,竟然如此那么我们就可以对他进行优化;

系统找r.id的模式见下图:

总结: 通过对上图的理解,那么我们得知findviewbyid(id) 的底层操作太耗时了,如果一个布局里面有一百多层,那么我就单单是找一个小小的'imageview' 都会找半天.幸好在2009年的google io大会上,google的工程师推出了一个优化的方式 通过自定义一个viewholder类,来对view的id进行绑定,从而减少系统查找这样的耗时操作.

两种优化方案实际代码如下:

/**
 * @param position 位置   
 * @param convertview 复用view

 * 历史回收的view对象. 当某个view对象被完全移除屏幕的时候 

 * 1. 尽量的复用converview(历史缓存的view),减少view对象创建的个数 
 * 2. 尽量的减少子孩子id的查询次数 . 定义一个viewholder
 */

@override
public view getview(final int position, view convertview,
    viewgroup parent) {
  view view;
  viewholder holder;
  if (convertview != null) {
    // 复用历史view对象
    view = convertview;
    holder = (viewholder) view.gettag();
  } else {
    // 创建新的view对象
    view = view.inflate(getapplicationcontext(),
        r.layout.item_callsmssafe, null);
    // 每次寻找子孩子消耗很多的资源cpu 内存.
    // 只有当子view对象第一次被创建的时候 查询id
    holder = new viewholder();
    holder.tv_mode = (textview) view
        .findviewbyid(r.id.tv_black_mode);
    holder.tv_phone = (textview) view
        .findviewbyid(r.id.tv_black_phone);
    holder.iv_delete_blacknumber = (imageview) view
        .findviewbyid(r.id.iv_delete_blacknumber);
    view.settag(holder);
}


/**
 * 子孩子id的容器
*/
static class viewholder {
  textview tv_phone;
  textview tv_mode;
  imageview iv_delete_blacknumber;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

上一篇:

下一篇: