写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. vim的保存误认为utf8问题

     用vim改脚本改到一处写到'太原':w一下,再打开,,结果给乱码了...我默认sql是用cp936的,,,想到到和记录本的联通问题一样....   可能会问我为什么不用utf8,,,,因为ms200 ...

  2. 一个强大的LogParser的UI工具--logparserlizard简介

    日志分析,特别是IIS日志,一般人都会想到LogParser工具,的确很强.但是命令行的操作界面令很多非专业的管理人员望而生畏,现在好了,有一个可视化的LogParser的UI工具可以使用了! Log ...

  3. UIButton 在UIScrollView里面 点击效果不明显的问题

    self.scrollView.delaysContentTouches = NO; -(BOOL)touchesShouldCancelInContentView { return YES; }

  4. 细雨学习笔记:Jmeter上一个请求的结果作为下一个请求的参数--使用正则提取器

    Jmeter接口自动化--使用正则提取器,可以把上一个请求的结果取出来,作为下一个请求的入参

  5. grails中报Cannot create a session after the response has been committed异常的解决办法

    在grails中,我们在layouts\main.gsp中使用类似如下的代码来判断当前用户处于登录状态时显示相关的登录信息: <g:if test="${session.users}& ...

  6. kali2 ssh

    vi /etc/ssh/sshd_config 1.将#PasswordAuthentication no的注释去掉,并且将NO修改为YES 2.将#PermitRootLogin without-p ...

  7. 阿里云存储OSS之九大使用技巧

    http://www.biphp.com/cloud-computing/%E9%98%BF%E9%87%8C%E4%BA%91%E5%AD%98%E5%82%A8oss%E4%B9%8B%E4%B9 ...

  8. javascript面向对象事件继承

    继承:父类有的,子类也有.父类改变,子类也跟着变. 属性继承:      矫正this (window对象,矫正成object对象)     fn .call(this是谁,参数1,参数2...); ...

  9. 著名加密库收集 Encrypt

    CryptoAPI 微软的CryptoAPI crypt32.lib,advapi32.lib,cryptui.lib #include <wincrypt.h>#include < ...

  10. Dagger2学习资源

    文章 Jack Wharton关于Dagger的幻灯片 代码 用Dagger2改写Jack Wharton的U+2020 我自己写的,包含了dagger2和单元测试 chiuki写的,包含了dagge ...