最近项目中碰到ScrollView嵌套ListView,搞了好久,ListView一直显示不全,网上找了好久,最终解决了,在此记录下,避免下次遇到时忘记
最初以为获取下ListView的高度,然后重新设置下ListView高度就可以了,代码如下
public void setLisViewHight(ListView listView) {
//获取listview的adapter
ListAdapter mAdapter = (ListAdapter) listView.getAdapter();
if (mAdapter == null) {
return ;
}
int totalHeight = 0;
//重复获取listview的子view的高度
for (int i = 0; i < mAdapter.getCount(); i++) {
//获取子view
View mView = mAdapter.getView(i, null, listView);
//获取子view的高度
mView.measure(
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
//叠加子view的高度,最终计算所有view的高度
totalHeight += mView.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
//最终listview高度是所有子view高度以及所有间隔的高度
//listView.getDividerHeight() 获取listview一个间隔的高度
//params.height即listview的高度
params.height = totalHeight + (listView.getDividerHeight() * (mAdapter.getCount() - 1));
listView.setLayoutParams(params);
return ;
}
但设置完后,发现ListView的高度还是不对,最终在网上搜索发现,只需要自定义一个ListView,重写onMeasure()方法,就可以让ListView自适应高度,如下
public class MyListview extends ListView {
public MyListview(Context context) {
super(context);
}
public MyListview(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public MyListview(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MyListview(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 重写该方法,达到使ListView适应ScrollView的效果
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}