ScrollView与ListView都具有滚动能力,对于这样的View控件,当ScrollView与ListView相互嵌套时会出现一些问题:
问题一:ScrollView与ListView嵌套导致ListView显示不全面
问题二:ScrollView不能正常滑动
1)动态设置listview高度
/** 动态设置listview高度
* @param listView
*/
public void setListViewHeight(ListView listView) {
ListAdapter adapter = listView.getAdapter();
if (adapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < adapter.getCount(); i++) {
View listItem = adapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1)) + 15;
listView.setLayoutParams(params);
}
这种方案的解决方法,缺点是convertView 为null
2)ListView 和 ScrollView 冲突的另一种解决方案(重写ListView)
/*
* @see android.widget.ListView#onMeasure(int, int)
* 重写该方法,以适应scrollview
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
存在问题:进入页面的时候,是从ListView 开始的,ScrollView 上面没有显示,要下拉的时候才显示。
解决方案:在ScrollView 的孩子根布局加上:
android:focusable="true"
android:focusableInTouchMode="true"
3)最后建议尽量不要ScrollView套AdapterView,虽然有方案解决,但是会影响性能,尽量使用ListView添加头部,尾部和多布局来实现相同的效果。