Android ListView常见的优化方式详解

 更新时间:2017年02月25日 14:54:58   作者:-RuiBo-  
这篇文章主要介绍了Android ListView常见的优化方式详解的相关资料,需要的朋友可以参考下

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;
}

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

相关文章

  • android监听返回按钮事件的方法

    android监听返回按钮事件的方法

    这篇文章主要介绍了android监听返回按钮事件的方法,涉及Android事件监听的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Android双重SurfaceView实现弹幕效果

    Android双重SurfaceView实现弹幕效果

    这篇文章主要为大家详细介绍了Android双重SurfaceView实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Android创建简单发送和接收短信应用

    Android创建简单发送和接收短信应用

    收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这项功能,而Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持。今天我们开始自己创建一个简单的发送和接收短信的应用,需要的朋友可以参考下
    2016-04-04
  • android listview优化几种写法详细介绍

    android listview优化几种写法详细介绍

    这篇文章只是总结下getView里面优化视图的几种写法,需要的朋友可以参考下
    2012-11-11
  • 在Android中通过Intent使用Bundle传递对象的使用方法

    在Android中通过Intent使用Bundle传递对象的使用方法

    这篇文章主要介绍了在Android中通过Intent使用Bundle传递对象的使用方法,详细介绍Intent使用Bundle传递对象的方法。有需要的可以了解一下。
    2016-11-11
  • Android WebView组件用法详解

    Android WebView组件用法详解

    这篇文章主要介绍了Android WebView组件用法,结合实例形式详细分析了Android WebView组件的功能、权限设置、布局及使用技巧,需要的朋友可以参考下
    2016-02-02
  • Android实现侧滑只需一步

    Android实现侧滑只需一步

    这篇文章主要介绍了Android实现侧滑只需一步,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 详解Android 视频滚动列表(偷懒型)

    详解Android 视频滚动列表(偷懒型)

    小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧本篇文章主要介绍了Android 视频滚动列表(偷懒型),
    2017-11-11
  • Android Fragment的生命周期详解

    Android Fragment的生命周期详解

    本文主要讲解Android Fragments的生命周期,这里整理了相关资料及对Fragment 的创建,有需要的小伙伴看下
    2016-09-09
  • 关于Android SDCard存储的问题

    关于Android SDCard存储的问题

    本篇文章小编为大家介绍,关于Android SDCard存储的问题。需要的朋友参考下
    2013-04-04

最新评论