在开发Android时,有时会出现ScrollView嵌套ListView的情况,第一次遇到这个问题的时候,大家都会觉得很头疼;然后会去网上找解决方案,最常见的一种解决方案就是动态的计算ListView的高度,然后再代码中重设其高度;解决方法如下:
/**
* 设置listview的高度。解决listview嵌套listview的时候,无法完整显示里边listview的高度问题。
* 使用条件:item必须为LinearLayout
* 用法:在setAdapter之后调用。
* @param listView 需要被计算高度的listview(子listview)
*/
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
if(listItem != null)
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
但是这个方法是有局限性的,使用条件在注释中有写,item必须为LinearLayout;其实如果认真看了这个代码应该能发现另外一个局限,动态计算ListView的高度实际上是计算了一个item的高度,然后再乘以count,再加上divider的高度;问题是,如果item的高度不一致怎么办,ListView的item不一致这个情况很常见的,像QQ空间动态界面等。
这个时候有另一种很好的解决方案,而且代码量很少,目前没有发现什么局限;这种方法重写了LIstView的onMeasure方法,实现了ScrollView嵌套ListView正常显示;代码如下:
public class InScrollListView extends ListView {
public InScrollListView(Context context) {
super(context);
}
public InScrollListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public InScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
解决各种Scroll嵌套listview,布布扣,bubuko.com
原文:http://blog.csdn.net/sweetvvck/article/details/23666583