写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. 定时组件quartz系列<三>quartz调度机制调研及源码分析

    quartz2.2.1集群调度机制调研及源码分析引言quartz集群架构调度器实例化调度过程触发器的获取触发trigger:Job执行过程:总结:附: 引言 quratz是目前最为成熟,使用最广泛的j ...

  2. Android数据库升级,数据不丢失解决方案

    假设要更新TableC表,建议的做法是: 1) 将TableC重命名为TableC_temp SQL语句可以这样写:ALERT TABLE TableC RENAME TO TableC_temp; ...

  3. 12、NFC技术:读写NFC标签中的Uri数据

    功能实现,如下代码所示: 读写NFC标签的Uri 主Activity import cn.read.write.uri.library.UriRecord; import android.app.Ac ...

  4. python的使用环境总结

    python在linux上运行,使用的是vim,每次都是敲四个空格进行缩进,真尼玛的蛋疼,书本果然是个好东西,从而根据书本python高级编程中的设置配置而来: 1.进行自动补全的脚本 [root@p ...

  5. MySQL DATE_SUB() 函数

    定义和用法 DATE_SUB() 函数从日期减去指定的时间间隔. 语法 DATE_SUB(date,INTERVAL expr type) date 参数是合法的日期表达式.expr 参数是您希望添加 ...

  6. VCS之Git

    Git -- open source distributed version control system -- A stream of snapshots(if no change,just lin ...

  7. Bluebird-Core API (三)

    Promise.join Promise.join( Promise<any>|any values..., function handler ) – -> Promise For ...

  8. NServiceBus-日志

    默认的日志 NServiceBus一些有限,固执己见,内置的日志记录. 默认的日��行为如下: 控制台 所有 Info(及以上)消息将被输送到当前的控制台. 错误将会写 ConsoleColor.Re ...

  9. DD_belatedPNG,解决 IE6 不支持 PNG-24 绝佳解决方案

    png24在ie下支持透明.终于找到下面的可行办法: 我们知道 IE6 是不支持透明的 PNG-24 的,这无疑限制了网页设计的发挥空间. 然而整个互联网上解决这个 IE6 的透明 PNG-24 的方 ...

  10. RxCache 的代码分析,含缓存时间duration的在代码中改变的自己实现的机制

    当应用进程创建 RxCache 的实例后,会给应用进程返回一个 rxcache实例及一个 ProxyProvider,代码如下: CacheProviders providers = new RxCa ...