这是个很老的问题了,今天有人问了下告诉别人了,但是解释的不是很清晰,这里我就在写下,只做自己回忆用的(( ⊙ o ⊙ )!)
一、问题的原因
由于嵌套后计算listview的高度出现问题导致的。比如在ScrollView中嵌套ListView空间,无法正确的计算ListView的大小,所以你们就只看到一行。
二、解决方法
1.重写listview的计算高度的方法(onMeasure)
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
这里说明下
/设置为Integer.MAX_VALUE>>2 是listview全部展开
//也可以设置为高度这里是设置listview的高度 不全部展开 实现可以滑动的效果
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
1.精确模式(MeasureSpec.EXACTLY)
2.最大模式(MeasureSpec.AT_MOST)
2.就是获取当前的listview的适配器,然后计算高度
public void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter,如果没有就返回
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
// listAdapter.getCount()返回数据项的数目
//这里你也可以设置自己想要的显示条数,当然要实现滚动
//你还要做些其他的设置
View listItem = listAdapter.getView(i, null, listView);
// 计算子项View 的宽高
listItem.measure(0, 0);
// 统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
最后我们说下recyclevew,recycleview的功能就很强大了,
它能自己处理一些焦点的问题,很多情况下都不用处理焦点了。
(而且最主要的是用recycleview写嵌套滑动布局很舒服)