对于ListView内部的ListView,一般用来展示少量的列表数据。

内部的ListView的高度看起来是一个固定值且无法滑动,这个就比较蛋疼了。、

提供两种解决方案,方案的核心都是重新设置内部ListView的高度。

1  通过定制组件,重新写一个控件,继承于ListView.

 

public class CustomisedListView extends ListView{

 

public CustomisedListView(Context context) {

super(context);

}

 

public CustomisedListView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

 

public CustomisedListView(Context context, AttributeSet attrs) {

super(context, attrs);

}

 

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  

     MeasureSpec.AT_MOST);

super.onMeasure(widthMeasureSpec, expandSpec);

}

}

然后将这个组件作为外部ListView的Item的一部分或全部就可以了。

2  直接在代码中指定内部ListView的高度

这个也分为两种情况:

A 计算出内部ListView中的所有Item的高度

 

public static void reSetListViewHeight(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);

}

这样就可以重新设置ListView的高度了

B预估出内部ListView每个Item的高度,直接写死,但感觉不如上面的好,上面的也有要求,内部ListView的Item一定得是LinearLayout