Android AbsListView子类反复调用getView()和getCount()问题分析
对于AbsListView子类,假设它的宽高是自适应的,你会发现getView()和getCount()会被疯狂的反复调用。即使在AbsListView子类设置完adapter后,getView()和getCount()也会被疯狂的调用10几次甚至更多。原因就在于measure过程,AbsListView子类会包含很多个item,而且由于AbsListView和Adapter机制的关系,会尽可能的将一系列item显示在屏幕中,当然这些item的父容器都是AbsListView子类。
在Android中View的布局机制分成两个阶段:measure和layout。在measure阶段时主要就是为了计算height和width。而且要注意的是,这是个递归的过程,从顶向下,DecorView开始依次调用自己子元素的measure。计算完成这两个参数后就开始layout,最后再是draw的调用。
为什么会有很多次反复调用呢?
对于AbsListView的子类,当然每一个Item都会被调用measure方法,而在这个过程中getView()和getCount()会被调用,而且看用户的需求,可能会有很多次反复调用。问题就在于在布局中AbsListView子类height和width属性的设置,以及它的父容器的height和width属性的设置了。
- 自适应(wrap_content):它会反复进行measure,因为它的宽高不确定,需要根据内容(也就是它的子Item)计算宽高,所以这个measure过程会反复执行,如果父元素也是wrap_content,这个过程会更加漫长。当AbsListView发生滚动时,因为有新的item进入了屏幕,旧的item出了屏幕,由于是自适应的关系,这个时候AbsListView就要根据item重新计算宽高,这样也会不可避免的发生反复调用。
- 填充效果(fill_parent或者match_parent):只要父容器大小确定,AbsListView的宽高也就固定了,及时AbsListView怎么样的滚动,其宽高都不需要重新计算
从上可知,为了避免AbsListView子类的getView()和getCount()被反复调用,我们应该尽量避免自适应,使用固定大小或者填充效果。
Android AbsListView子类反复调用getView()和getCount()问题分析的更多相关文章
- android ListView 多次调用 getView方法
<ListView android:layout_width="match_parent" android:layout_heig ...
- 自定义Adapter为什么会重复多轮调用getView?——原来是ListView.onMeasure在作祟
相信很多人在使用自定义Adapter的时候都遇到这样的问题: 假设Adapter数据源中只有30个Item,理论上每显示一个新的Item的时候就会调用一次getView,均显示一次的话是要调用getV ...
- 何时调用getView?——从源码的角度给出解答
先来看ListView类中的makeAndAddView方法: 没有数据变化:从mRecycler中取得可视的view 数据有变化:obtainView /** * 获取视图填充到列表的item中去, ...
- Android和JavaScript相互调用的方法
转载地址:http://www.jb51.net/article/77206.htm 这篇文章主要介绍了Android和JavaScript相互调用的方法,实例分析了Android的WebView执行 ...
- 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案
相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...
- Unity开发Android应用程序:调用安卓应用程序功能
开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...
- android与javascript相互调用
下面这一节来介绍android和javascript是怎么相互调用的,这样我们的UI界面设计起来就简单多了,而且UI设计起来也可以跨平台.现在有好多web app前台框架了,比如sencha和jque ...
- Android开发中怎样调用系统Email发送邮件(多种调用方式)
在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...
- Android NDK开发及调用标准linux动态库.so文件
源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...
随机推荐
- Ionic login简单登录页面
1.login.html <ion-view view-title="登录" hide-nav-bar="true"> <div class= ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--07--06CMDB测试Linux系统采集硬件数据的命令02
#settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...
- linux管道和tee命令
ps -ef | grep docker 等价于 ps -ef &> >(grep docker) cat a.log | tee b.txt 等价于 cat a.log & ...
- 如何使用JMeter 进行压力测试
文件转载至:https://jingyan.baidu.com/album/a681b0de5b85db3b184346b9.html?picindex=2 1.打开JMeter, 更改语言为中文,官 ...
- C# 制作ActiveX控件并添加到网页
1.创建ActiveX控件——按钮 2.定义一个接口,并在控件中实现 3.部署安装 4.CAB打包 5.添加到网页中进行测试 一. 创建ActiveX控件——按钮 1.新建一个Window窗体控件库项 ...
- Latex报错: Could not start the command: xelatex.exe -synctex=1 -interaction=nonstopmode?
Latex报错: Could not start the command: xelatex.exe -synctex=1 -interaction=nonstopmode 网上还有很多说出Could ...
- mybatis学习:mybatis的环境搭建与入门
一.mybatis的概述: mybatis是一个持久层框架,用java编写 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接登繁杂过程 它使用了ORM思想 ...
- scikit-learn的基本使用
在机器学习和数据挖掘的应用中,scikit-learn是一个功能强大的python包.在数据量不是过大的情况下,可以解决大部分问题.学习使用scikit-learn的过程中,我自己也在补充着机器学习和 ...
- spring源码学习之容器的扩展(一)
在前面的章节,我们一直以BeanFactory接口以及它的默认实现XmlBeanFactory为例进行解析,但是,spring还提供了另一个接口ApplicationContext,用于扩展BeanF ...
- php连接数据库查询方法(还少一种pdo方法)
<?php header("content-type:text/html;charset=utf-8"); $conn = mysql_connect("local ...