前几天由于项目的须要,要在一个ListView中放入另外一个ListView,也即在一个ListView的每一个ListItem中放入另一个ListView。但刚开始的时候,会发现放入的小ListView会显示不彻底,它的高度始终有问题。上网查了下,发现别人也有遇到这样的问题,而大多数人都不推荐这样的设计,由于默认状况下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是没法计算的。ide
又搜索了一下,发现有StackOverflow上的牛人已经解决了这个问题,通过试验发现是能够解决问题的,它的思路就是在设置完ListView的Adapter后,根据ListView的子项目从新计算ListView的高度,而后把高度再做为LayoutParams设置给ListView,这样它的高度就正确了,如下是源码:spa
public class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}设计
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}事件
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}get
只要在设置ListView的Adapter后调用此静态方法便可让ListView正确的显示在其父ListView的ListItem中。可是要注意的是,子ListView的每一个Item必须是LinearLayout,不能是其余的,由于其余的Layout(如RelativeLayout)没有重写onMeasure(),因此会在onMeasure()时抛出异常。源码
在ScrollView中嵌套ListView(或者ScrollView)的另一个问题就是,子ScrollView中没法滑动的(若是它没有显示彻底的话),由于滑动事件会被父ScrollView吃掉,若是想要让子ScrollView也能够滑动,只能强行截取滑动事件,有牛人在论坛中发过代码说能够。虽然我没有亲自试过,但估计是可行的。it
虽然在ScrollView中显示ScrollView在技术上的难题能够攻破,可是这样的设计倒是很是差的用户体验由于用户会不容易看到和操做子ScrollView中的内容。好比好的设计是,父ListView的每一个Item只显示归纳性的描述,而后点击其Item会进入另一个页面来详细描述和展现以及对这个Item的操做。io