在开发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