android中listview的getView方法不调用的一种状况

1,个人ListView是放在一个ScrollView中的,listView中加了一个HeaderView(头布局)。你们都知道在ScrolleView中使用ListView须要计算listview每一个item的高度,否则的话,listview只会显示一个item。因此我在初始化的时候调用了下面的方法计算了listView  item 的高度:java

public void setListViewHeightBasedOnChildren(ListView listView) {服务器

// 获取ListView对应的Adapteride

ListAdapter homeAdapter = listView.getAdapter();布局

if (homeAdapter == null) {spa

return;debug

}指针

int totalHeight = 0;调试

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

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

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布局喽。
相关文章
相关标签/搜索