Android LIstView初次创建getview方法执行多次问题
写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方法执行多次问题的更多相关文章
- [Android]ListView的Adapter.getView()方法中延迟加载图片的优化
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4139998.html 举个例子吧,以好友列表为例 ListVi ...
- [Android]在Adapter的getView方法中绑定OnClickListener比较好的方法
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4146512.html 给ListView中每个item绑定点 ...
- Android子线程创建Handler方法
如果我们想在子线程上创建Handler,通过直接new的出来是会报异常的比如: new Thread(new Runnable() { public void run() { Handler hand ...
- ListView / GirdView Adpater的getView方法,首项多次调用
通过Adapter为AbslistView提供内容是一个常见的做法:在ListView或者GridView的Adapter中的getView()方法中,加入一行日志,看getView()被调用的情况 ...
- 自定义adapter 的getView方法被重复执行了n次的解决方法
1. getView执行的次数和你的getCount没有直接的关系 ,getCount和你listView里面的条目数量(行数量)有关系 ,getView方法执行次数取决于你屏幕上显示几个条目,比 ...
- Android ListView的优化
最近的项目中有通讯录这个模块,里面的通讯录涉及的联系人数量很大,导致在加载页面的时候有点卡,所以就必须得进行优化,优化的最终实现理论是什么?就是让ListView一次性加载的数据较少,后续根据用户操作 ...
- android Listview 软引用SoftReference异步加载图片
首先说一下,android系统加载大量图片系统内存溢出的3中解决方法: (1)从网络或本地加载图片的时候,只加载缩略图.这个方法的确能够少占用不少内存,可是它的致命的缺点就是,因为加载的是缩略图,所以 ...
- android ListView 多次调用 getView方法
<ListView android:layout_width="match_parent" android:layout_heig ...
- Android ListView getView()方法重复调用导致position错位
问题现状:Android ListView getView()方法重复调用导致position错位 解决办法:把ListView布局文件的layout_height属性改为fill_parent或者m ...
随机推荐
- 如何定义 Java 中的方法
所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 public.protected.p ...
- Http中Cookie与Set-Cookie头
[原文:http://hi.baidu.com/qinglvzhuye/item/6664a807bb8be3dd73e676d6] android 获取 cookies 有很多办法,但是记住了. h ...
- iOS 开发者必不可少的 75 个工具,你都会了吗
如果你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完成不同的任务. 软件开发同样如此.你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具不断 ...
- PHP中超全局变量$GLOBALS和global的区别
一.超全局变量$GLOBALS PHP超全局变量有很多,如下的都属于超全局变量(Superglobal): $GLOBALS,$_SERVER,$_GET,$_POST,$_FILES,$_COOKI ...
- 恢复SD卡错删数据
对于众多米粉来说,手机里存储的很多资料都非常宝贵,如果不小心删除了,想要重新收集这些资料就显得非常困难.有道是千金易得,数据无价,特别是一些珍贵照片之类的充满回忆的数据,丢失了甚至会抱憾 ...
- YII内置验证规则
required: 必填字段验证, 来自 CRequiredValidator类的别名 array(‘字段名列表用逗号隔开’, ‘required’), 就这样的一个小小的写法,可以让字段前面加 ...
- [转]linux之more命令
转自:http://www.cnblogs.com/peida/archive/2012/11/02/2750588.html more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示 ...
- 说说Python 中的文件操作 和 目录操作
我们知道,文件名.目录名和链接名都是用一个字符串作为其标识符的,但是给我们一个标识符,我们该如何确定它所指的到底是常规文件文件名.目录名还是链接名呢?这时,我们可以使用os.path模块提供的isfi ...
- 算法:最大子数组own
转载标明出处:http://i.cnblogs.com/EditPosts.aspx?postid=4726782&update=1 暴力法: // maxValue.cpp : 定义控制台应 ...
- C 基于socket实现简单的文件传输
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAicAAAA5CAIAAABicRxIAAAgAElEQVR4nOy9Z5NVV5om+rzL773POW