这几天正在学习有关嵌套的知识,其中出现过嵌套后ListView只显示一行数据等,高度不准
用两种简单的方法即可解决:
一: 在listView.setAdapter() 后 调用Utility.setListViewHeightBaseOnChildren(listView);
public class Utility {
public static void setListViewHeightBaseOnChildren(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);
listItem.measure(0,0);
totalHeight+=listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
//最后得到整个ListView完整显示需要的高度
params.height = totalHeight+(listView.getDividerHeight()*(listAdapter.getCount()-1));
listView.setLayoutParams(params);
}
}
ok
二:自定义ListView, 重写一下onMeasure()方法,通知父布局高度即可
public class ExpandListView extends ListView {
public ExpandListView(Context context) {
super(context);
setBackgroundColor(Color.argb(100, 0, 55, 55));
}
public ExpandListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ExpandListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 这里的widthMeasureSpec和heightMeasureSpec就是ScrollView给的建议,
* 告诉ListView你想要多高都行,但是ListView耍贱不领情。
* 所以我们只能伸出我们的上帝之手,手动把heightMeasureSpe改为At_MOST模式,
* 并把size改为Integer.MAX_VALUE >> 2。
* <p>
* Integer.MAX_VALUE >> 2表示父View允许的最大高度,
* measureHeightOfChildren()中最后会判断计算出的高跟这个值做比较,
* 要是计算出的高大于最大限定高,则会返回上一次的高或者最大限定高。我们设为Integer.MAX_VALUE >> 2,
* 理论上计算出来的高不会超过这个限定。
*
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
欢迎纠错。