博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android中listview的getView方法不调用的一种情况
阅读量:6908 次
发布时间:2019-06-27

本文共 2834 字,大约阅读时间需要 9 分钟。

hot3.png

1,我的ListView是放在一个ScrollView中的,listView中加了一个HeaderView(头布局)。大家都知道在ScrolleView中使用ListView需要计算listview每个item的高度,不然的话,listview只会显示一个item。所以我在初始化的时候调用了下面的方法计算了listView  item 的高度:

public void setListViewHeightBasedOnChildren(ListView listView) {

// 获取ListView对应的Adapter

ListAdapter homeAdapter = listView.getAdapter();

if (homeAdapter == null) {

return;

}

int totalHeight = 0;

for (int i = 0, len = homeAdapter.getCount(); i < len; i++) {

// listAdapter.getCount()返回数据项的数目

View listItem = homeAdapter.getView(i, null, listView);

// 计算子项View 的宽高

listItem.measure(0, 0);

int childHeight = listItem.getMeasuredHeight();

// 统计所有子项的总高度

totalHeight += childHeight;

}

ViewGroup.LayoutParams params = listView.getLayoutParams();

params.height = totalHeight + (listView.getDividerHeight() * (homeAdapter.getCount() - 1));

// listView.getDividerHeight()获取子项间分隔符占用的高度

// params.height最后得到整个ListView完整显示需要的高度

listView.setLayoutParams(params);

}

在我没有用数据调试的时候没有任何问题。当从服务器拿到数据,然后通知adapter.notifyDataSetChanged();的时候,问题出现了,adapter的getCount()调用,而getView()怎么都不调用,瞎折腾了两小时之后,豁然开朗,原来计算listview中item的高度需要在调用了adapter.notifyDataSetChanged();这个之后去计算,之前没有数据listView根本不知道自己有多少item。

将etListViewHeightBasedOnChildren(mListView)挪到adapter.notifyDataSetChanged()后面,一切正常。

另外,如果listview有headerView的话,计算的时候,headView的高度也需要计算。如果headerView中有一些布局需要有数据时显示,没数据时不显示的话,就需要根据数据来计算他显示的布局的高度:如下方法:

public void setListViewHeightBasedOnChildren(ListView listView) {		// 获取ListView对应的Adapter		ListAdapter homeAdapter = listView.getAdapter();		if (homeAdapter == null) {			return;		}		int totalHeight = 0;		for (int i = 0, len = homeAdapter.getCount(); i < len; i++) {			// listAdapter.getCount()返回数据项的数目			View listItem = homeAdapter.getView(i, null, listView);			// 计算子项View 的宽高			listItem.measure(0, 0);			int childHeight ;			if (i == 0) {//是header视图				if (GlobalVariable.mLabels.size() < 3) {					childHeight = listItem.getMeasuredHeight();				}else if (GlobalVariable.mLabels.size() < 6) {					childHeight = listItem.getMeasuredHeight()*2;				}else {					childHeight = listItem.getMeasuredHeight()*3;				}			}else{				childHeight = listItem.getMeasuredHeight();			}			// 统计所有子项的总高度			totalHeight += childHeight;		}		ViewGroup.LayoutParams params = listView.getLayoutParams();		params.height = totalHeight + (listView.getDividerHeight() * (homeAdapter.getCount() - 1));		// listView.getDividerHeight()获取子项间分隔符占用的高度		// params.height最后得到整个ListView完整显示需要的高度		listView.setLayoutParams(params);	}

跟上面不同的是,我计算了headview中每个子布局的高度

后续附加:

ListView 跟ScroolView 共存 listItem.measure(0, 0) 空指针

我每次调用的时候都会产生在listItem.measure(0,0)报空指针异常。我debug 发现listItem 并不是为空啊,为啥会报错。在经过一番查找之后。我发现原来是自己item的布局用了RelativeLayout 把他换为LinearLayout 就好了。究其原因,原来是 Linearlayout重写了onmeasure方法,其他的布局文件没有重写onmeasure,所以在调用listItem.measure(0, 0); 会报空指针异常,如果想用这个东东,就必须用linearlayout布局喽。

转载于:https://my.oschina.net/u/936286/blog/182180

你可能感兴趣的文章
六、安装laravel5.1
查看>>
华为交换机批量加入 Vlan 方法
查看>>
async 与 await 线程调用顺序
查看>>
马的种类(十四)
查看>>
路由、交换如何Telnet远程配置。
查看>>
Linux文本查看命令之uniq
查看>>
三大闪存芯片的类型比较TLC/MLC/SLC(转载)
查看>>
面试题
查看>>
再见!史上最失败的windows系统!
查看>>
EditText 只能输入数字字母
查看>>
nginx的valid_referers指令——防盗链
查看>>
Spark DecisonTree DebugString Parser
查看>>
Laravel验证码
查看>>
tomcat 服务器 和 servlet 容器
查看>>
varchar(N)和char(N)中的N解析
查看>>
java 执行Sql文件
查看>>
Android开发和iOS开发对比
查看>>
vue中的条件渲染
查看>>
lnmp搭建
查看>>
正确使用差异硬盘创建虚拟机
查看>>