最近做项目发现一个界面当有ListView是,getView和getCount中的log被疯狂调用。一个5个Item的ListView,getView竟然会被反复调用7组。尤其是当ItemView中需要加载图片时,很容易造成GC过多,很容易出现ANR。

原因就在于measure过程,ListView一般都会有好多个Item,而且也会同时显示若干组Item,这些Item的父元素都是这个ListView。

更具Google的解释,View在Draw的时候分成两个阶段:measure和layout,在measure阶段时主要就是为了计算两个参数:height和width。而且要注意的是,这是个递归的过程,从顶向下,DecorView开始依次调用自己子元素的measure。计算完成这两个参数后就开始layout,最后再是draw的调用。

对于ListView,当然每一个Item都会被调用measure方法,而在这个过程中getView和getCount会被调用,而且看用户的需求,可能会有很多次调用。

而为什么会有很多组次调用呢?

问题就在于在layout中的决定ListView或者它的父元素的height和width属性的定义了。fill_parent会好一点,计算方法会比较简单,只要跟父元素的大小相似就行,但是即使是fill_parent,也不能给View当饭吃,还是要计算出来具体的dip,所以measure还是会被调用,只是可能比wrap_content的少一点。至于自适应的它会一直考量它的宽和高,根据内容(也就是它的子Item)计算宽高。可能这个measure过程会反复执行,如果父元素也是wrap_content,这个过程会更加漫长。

所以,解决方法就是尽量避免自适应,除非是万不得已,固定大小或者填充的效果会比较好一些。

当我们在使用listview的时候。有时候自定义adapter的时候,是不是会发现在getview里打印日志的时候,重复调用很多次?有时候4次。有的严重甚至到10次,当我们在listview中移动的时候。每移动一列都会调用很多次,这样大大影响到效率!其实这和listview本身在android上的机制有关。下面我开始来介绍一下吧:

在布局,我们只有一个listview的时候。那好。我们把高设置成wrap_content的时候。在listview里加载几行看看。日志在getview里打印一下。是不是重复调用了?那这个办法就好弄了。把高设置成fill_parent就成了。这个时候发现日志还是重复调用?那就要看一下Listview的上一级而已的高是不是也是设置也fill_parent的,如果不是。请改动吧。如果是。。。那我还真没碰到重复调用的!因为测试好几次了!

如果我们在而已里不只一个Listview。一个复杂好看的布局可能有很多。listview在布局的某个地方。这个时候有时候运气不好。你会发现你调用了很多次getview。我测试的时候。最高230次。。。可想而知。这个速度是相当慢。而且每移动一次就是调用这么多次!对于这样的情况,在修改布局的时候,要考虑以下两点:1.首先考虑需求布局和性能哪个更重要一点。2.考虑listview周边哪个布局控件影响到了它!

如果在性能上没有太大影响,而需求要求必需是那样的布局。那就以布局为主。看看有没有别的方法来优化一下listview,当然前提是布局一点都不能调整。如果能调整,布局没有太大变动。而listview又能很好的优化。那就当然优化了!当我们优化的时候。首先要看一下有没有影响到Listview重绘的控件,比如。如果它上面和下面都有控件。而且高都是wrap_content,那么你就要设置成fill_parent或者固定高。这样listview在高上就不会重绘,这是最主要的一点。那左右是不是也有控件(一般一个手机页面用到list的时候不会有这么多控件)?有,那我们就也要调整,那就同高一样的设置。一定要让listview是一个固定在那个地方不动的。不然,你就等着让他重复去调用吧!

其实说了这么多。最主要的还是在我们进行布局的时候。要巧妙的运用每个控件的属性,以及了解控件每个的原理。这样在我们进行UI设计的时候,才能很好的去结合!

Android ListView反复调用getView和getCount相关推荐

  1. Android AbsListView子类反复调用getView()和getCount()问题分析

    对于AbsListView子类,假设它的宽高是自适应的,你会发现getView()和getCount()会被疯狂的反复调用.即使在AbsListView子类设置完adapter后,getView()和 ...

  2. Android中的GridView反复调用getView和getCount,并且getView中的position的值几乎都是0

    最近做项目发现一个界面当用到GridView的时候,getView和getCount中的log被疯狂调用,并且getVIew中的LOG每出来一次就是四条,并且这四条数据的position的值都是0.一 ...

  3. android listview 连续调用 getview问题分析及解决。

    当我们在使用listview的时候.有时候自定义adapter的时候,是不是会发现在getview里打印日志的时候,重复调用很多次?有时候 4次.有的严重甚至到10次,当我们在listview中移动的 ...

  4. [Android]ListView的Adapter.getView()方法中延迟加载图片的优化

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4139998.html 举个例子吧,以好友列表为例 ListVi ...

  5. ListView连续调用getview问题分析及解决

    当我们在使用listview的时候.有时候自定义adapter的时候,是不是会发现在getview里打印日志的时候,重复调用很多次?有时候4次.有的严重甚至到10次,当我们在listview中移动的时 ...

  6. android listview固定内容,android ListView详解

    在android开发中ListView是非常重要的控件.我自己也还是一个小白,把自己的学习经验分享出来,希望可以帮到初学Android的朋友们.这也是我第一次写博客,我尽量将结构处理的好一些,也说的易 ...

  7. android ListView包含Checkbox滑动时状态改变

    题外话: 在xamarin android的开发中基本上所有人都会遇到这个小小的坎,的确有点麻烦,当时我也折腾了好一半天,如果你能看到这篇博客,说明你和我当初也是一样的焦灼,如果你想解决掉这个小小的坎 ...

  8. android listview 不显示_ListView详细介绍与使用

    image 前言介绍: 关于 ListView 我们大家都应该是非常的熟悉了,在 Android 开发中是经常用到的,今天就再来回顾一下,ListView 的使用方法,和一些需要优化注意的地方,还有日 ...

  9. android ListView详解

    在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示.抽空把对ListView的使用做了整理,并写了个小例子,如下图. 列表的显示需要三 ...

最新文章

  1. python读取redis存储数据的存储时间_Python读写Redis数据库操作示例
  2. 使用Arquillian测试Spring Data + Spring Boot应用程序(第2部分)
  3. putty怎么远程控制linux应用,如何使用linux系统远程操作软件putty!
  4. Super VLAN
  5. 【白皮书分享】低幼年龄段在线教育白皮书.pdf(附下载链接)
  6. python装饰器应用_Python装饰器实现方法及应用场景详解
  7. 【UML建模案例】小型网上书店系统
  8. 郑州大学计算机上机模拟题库,郑州大学VB考试模拟试题
  9. Returned object not currently part of this pool
  10. AntDesign 表格设置背景色
  11. Oracle安装之后电脑变慢
  12. 关于将驱动整合至ESXi镜像过程中的一些小坑
  13. 安全狗加入天翼网信安全产业联盟 发挥云安全生态影响力
  14. 群晖添加第三方套件源提示无效位置的解决方法(解决群晖 CA 根证书过期的问题)
  15. DM达梦数据库的修改数据库和修改系统命令
  16. Braft--工作日记
  17. HTML和CSS的概述
  18. OpenCV学习笔记 - OpenCV必知必会的基础
  19. Web开发应了解的5种设计模式
  20. 微软ATP公益演讲| 如何培养在逆境中的生长力量

热门文章

  1. 编译安装RRDtool报错
  2. 读《Computer Systems: A Programmer’s Perspective》
  3. Sencha-命令-CMD(与Touch的结合运用)(官网文档翻译30)
  4. iphone @selector带参数问题
  5. Hibernate中hbm.xml文件的inverse、cascade、fetch、outer-join、lazy
  6. 初试 spring web mvc
  7. Eclipse中配置CORBA环境
  8. 紧急事态分析及处理方法
  9. 正则表达式确实是一种考验
  10. 使用nlite制作集成驱动windows安装光盘及实践心得