写listview优化的时候,发现Listview初次创建的时候会多次执行getView方法。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.hang.myapplication.MainActivity">
<ListView
android:id="@+id/list_item1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>

这是listview的布局,执行后结果为:

06-30 20:04:14.094 1166-1166/com.example.hang.myapplication D/hello: convertView为空0
06-30 20:04:14.104 1166-1166/com.example.hang.myapplication D/hello: convertView为空1
06-30 20:04:14.104 1166-1166/com.example.hang.myapplication D/hello: convertView为空2
06-30 20:04:14.114 1166-1166/com.example.hang.myapplication D/hello: convertView为空3
06-30 20:15:31.944 13339-13339/com.example.hang.myapplication D/hello: convertView为空0
06-30 20:15:31.944 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:15:31.954 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:15:31.954 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3
06-30 20:15:31.954 13339-13339/com.example.hang.myapplication D/hello: convertView不为空0
06-30 20:15:31.954 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:15:31.954 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:15:31.954 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3
06-30 20:15:31.984 13339-13339/com.example.hang.myapplication D/hello: convertView不为空0
06-30 20:15:31.994 13339-13339/com.example.hang.myapplication D/hello: convertView为空1
06-30 20:15:31.994 13339-13339/com.example.hang.myapplication D/hello: convertView为空2
06-30 20:15:31.994 13339-13339/com.example.hang.myapplication D/hello: convertView为空3
06-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView为空0
06-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3
06-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不为空0
06-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3
06-30 20:15:32.124 13339-13339/com.example.hang.myapplication D/hello: convertView不为空0
06-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3
06-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不为空0
06-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3

这显然不正常,执行了多次getview方法。经过群友的提示修改为fill_partent后结果显示正常。

06-30 20:04:14.094 1166-1166/com.example.hang.myapplication D/hello: convertView为空0
06-30 20:04:14.104 1166-1166/com.example.hang.myapplication D/hello: convertView为空1
06-30 20:04:14.104 1166-1166/com.example.hang.myapplication D/hello: convertView为空2
06-30 20:04:14.114 1166-1166/com.example.hang.myapplication D/hello: convertView为空3

后来联想到UI的优化,恍然大悟~

  RelativeLayouts经常需要measure所有子节点两次才能把子节点合理的布局。如果子节点设置了weights属性,LinearLayouts也需要measure这些节点两次,才能获得精确的展示尺寸。

  在UI布局优化中,推荐扁平式布局。也是因为view开始被measure时,该view所有的子view都会被重新layout,再把该view传递给它的父view,如此重复一直到最顶部的根view。layout完成之后,所有的view都被渲染到屏幕上,并不是只有用户看得见的view才会被渲染,所有的view都会。这样一个view会被多次measure。getiew也执行了多次。

后来我嵌套了一层RelativeLayout,执行后发现getview执行次数比不嵌套多了一次~,嵌套linearlayout是没有任何变化的

06-30 20:25:18.314 13339-13339/com.example.hang.myapplication D/hello: convertView为空0
06-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3
06-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不为空0
06-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3
06-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不为空0
06-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:25:18.334 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3
06-30 20:25:18.334 13339-13339/com.example.hang.myapplication D/hello: convertView不为空0
06-30 20:25:18.334 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:25:18.334 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:25:18.334 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3
06-30 20:25:18.344 13339-13339/com.example.hang.myapplication D/hello: convertView不为空0
06-30 20:25:18.344 13339-13339/com.example.hang.myapplication D/hello: convertView为空1
06-30 20:25:18.354 13339-13339/com.example.hang.myapplication D/hello: convertView为空2
06-30 20:25:18.354 13339-13339/com.example.hang.myapplication D/hello: convertView为空3
06-30 20:25:18.404 13339-13339/com.example.hang.myapplication D/hello: convertView为空0
06-30 20:25:18.404 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:25:18.404 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空0
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空0
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空0
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空1
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空2
06-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不为空3

  解决方案,设置为fill_partent或者设置为固定的数值,优化UI布局。这个问题也可能会导致加载图片等错位。

Android LIstView初次创建getview方法执行多次问题的更多相关文章

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

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

  2. [Android]在Adapter的getView方法中绑定OnClickListener比较好的方法

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4146512.html  给ListView中每个item绑定点 ...

  3. Android子线程创建Handler方法

    如果我们想在子线程上创建Handler,通过直接new的出来是会报异常的比如: new Thread(new Runnable() { public void run() { Handler hand ...

  4. ListView / GirdView Adpater的getView方法,首项多次调用

    通过Adapter为AbslistView提供内容是一个常见的做法:在ListView或者GridView的Adapter中的getView()方法中,加入一行日志,看getView()被调用的情况 ...

  5. 自定义adapter 的getView方法被重复执行了n次的解决方法

    1. getView执行的次数和你的getCount没有直接的关系   ,getCount和你listView里面的条目数量(行数量)有关系 ,getView方法执行次数取决于你屏幕上显示几个条目,比 ...

  6. Android ListView的优化

    最近的项目中有通讯录这个模块,里面的通讯录涉及的联系人数量很大,导致在加载页面的时候有点卡,所以就必须得进行优化,优化的最终实现理论是什么?就是让ListView一次性加载的数据较少,后续根据用户操作 ...

  7. android Listview 软引用SoftReference异步加载图片

    首先说一下,android系统加载大量图片系统内存溢出的3中解决方法: (1)从网络或本地加载图片的时候,只加载缩略图.这个方法的确能够少占用不少内存,可是它的致命的缺点就是,因为加载的是缩略图,所以 ...

  8. android ListView 多次调用 getView方法

    <ListView            android:layout_width="match_parent"            android:layout_heig ...

  9. Android ListView getView()方法重复调用导致position错位

    问题现状:Android ListView getView()方法重复调用导致position错位 解决办法:把ListView布局文件的layout_height属性改为fill_parent或者m ...

随机推荐

  1. 【转】Bootloader之uBoot简介(转)

    原文网址:http://blog.csdn.net/sadamoo/article/details/8139946 来自http://blog.ednchina.com/hhuwxf/1915416/ ...

  2. bootstrap-datepicker 插件修改为默认中文

    bootstrap-datepicker 是一个非常优秀的时间选择插件,默认是英文显示日期的,通过下面几个小修改让其支持默认中文 1.首先将 bootstrap-datepicker.js 另存为 u ...

  3. Nginx实现多个站点使用一个端口(配置Nginx的虚拟主机)

    Nginx 是一个轻量级高性能的 Web 服务器, 并发处理能力强, 消耗资源小, 无论是静态服务器还是网站, Nginx 表现更加出色, 作为 Apache 的补充和替代使用率越来越高,目前很多大型 ...

  4. jQuery和CSS 3定制HTML 5视频播放器

    目前,随着越来越多的浏览器开始支持更多的HTML5新特性,开发者也逐渐关注HTML5的开发.在众多HTML5的新特性中,视频方面的新特性是 很值得开发者和用户关注的.现在,只需要有支持HTML5的浏览 ...

  5. 【初识——最大流】 hdu 1532 Drainage Ditches(最大流) USACO 93

    最大流首次体验感受—— 什么是最大流呢? 从一个出发点(源点),走到一个目标点(汇点),途中可以经过若干条路,每条路有一个权值,表示这条路可以通过的最大流量. 最大流就是从源点到汇点,可以通过的最大流 ...

  6. Yii表单验证

    我之前在朋友的公司拿到他们oa的代码,发现是用Yii写的,oa系统比较简单,但是程序员对Yii的运用比较好,我拿来学习一下.如果有需要,我可以私下分享这个程序,因为是人家的功劳,不在网上公布代码了,只 ...

  7. php常用正则

    平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: 2.    "^\d+$" //非负整数(正整数 + 0) 3.    "^[0-9]*[1 ...

  8. js保留小数点后N位的方法介绍

    js保留小数点后N位的方法介绍 利用toFixed函数 代码如下 复制代码 <script language="javascript"> document.write( ...

  9. 组建自动化工具Ant

    组建自动化工具Ant Ant可以帮助我们自动化的完成项目的构建 下面是维基百科对Ant的介绍:http://zh.wikipedia.org/wiki/Apache_Ant Apache Ant,是一 ...

  10. MapReduce阅读

    1.mongodb权威指南6.4章 2.百科:http://baike.baidu.com/link?url=fl9FwgNq7gtFLwJ-GuKsJ25Uk-wnhgDjEwkKd8-5hoIkh ...