全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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  # ListView常见的优化  # listview  # 优化的方法  # listview优化方法  # Android中ListView的几种常见的优化方法总结  # Android ListView适配器(Adapter)优化方法详解  # Android ListView介绍及优化方案  # 实例讲解Android app开发中ListView的基本使用及优化  # 浅谈Android开发中ListView控件性能的一些优化方法  # Android编程使用缓存优化ListView的方法  # Android ListView优化之提高android应用效率  # Android中ListView Item布局优化技巧  # android listview优化几种写法详细介绍  # 复用  # 对他  # 两种  # 就可以  # 上图  # 都是  # 我就  # 半天  # 树状  # 希望能  # 几种  # 自定义  # 是说  # 不做  # 不为  # 找一个  # 谢谢大家  # 介绍一下  # 大会上  # 可以利用 


相关文章: 如何通过智能用户系统一键生成高效建站方案?  如何快速搭建高效服务器建站系统?  如何彻底卸载建站之星软件?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  上海网站制作开发公司,上海买房比较好的网站有哪些?  如何在阿里云虚拟服务器快速搭建网站?  建站之星微信建站一键生成小程序+多端营销系统  如何在阿里云香港服务器快速搭建网站?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  建站之星代理如何优化在线客服效率?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  已有域名和空间,如何快速搭建网站?  ,怎么用自己头像做动态表情包?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  已有域名建站全流程解析:网站搭建步骤与建站工具选择  三星网站视频制作教程下载,三星w23网页如何全屏?  Thinkphp 中 distinct 的用法解析  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  如何有效防御Web建站篡改攻击?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  如何用好域名打造高点击率的自主建站?  宝塔建站后网页无法访问如何解决?  建站之星如何修改网站生成路径?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  如何在Golang中使用replace替换模块_指定本地或远程路径  如何续费美橙建站之星域名及服务?  香港服务器租用费用高吗?如何避免常见误区?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  如何用低价快速搭建高质量网站?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  如何通过远程VPS快速搭建个人网站?  Android自定义listview布局实现上拉加载下拉刷新功能  广州商城建站系统开发成本与周期如何控制?  制作营销网站公司,淘特是干什么用的?  独立制作一个网站多少钱,建立网站需要花多少钱?  山东网站制作公司有哪些,山东大源集团官网?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  c++怎么用jemalloc c++替换默认内存分配器【性能】  黑客如何通过漏洞一步步攻陷网站服务器?  Python文件管理规范_工程实践说明【指导】  建站之星如何优化SEO以实现高效排名?  北京网站制作网页,网站升级改版需要多久?  清除minerd进程的简单方法  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  如何在IIS管理器中快速创建并配置网站?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  建站168自助建站系统:快速模板定制与SEO优化指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。