最近开发中遇到一个问题,就是ScrollView和ListView不能并存的问题。
有一个很长的页面(超出了手机的屏幕),上面有许多的内容。一般情况下我们会将这些控件放置在ScrollView中,当超出屏幕范围时,ScrollView会自动为我们加上垂直滚动条。但是ListView控件本身也会根据屏幕大小自动添加垂直滚动条,所以两者在一起的时候会造成冲突。
一般表现为ListView无法正常展示全部数据,只能看到一到两个条目,如下图所示。
官方API也建议不要将两者一起使用,但是我们确实有这样的需求怎么办呢。
仔细观察上图可以发现ListView 没有展示完全,原因是ScrollView没能正确计算出ListView所在布局的高度。我们可以手动计算出ListView的高度,然后改变它所在布局的高度。这样ScrollView就能正常显示了。
函数代码如下:
public void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter(); //取得listview绑定的适配器
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()));
listView.setLayoutParams(params); //改变listview所在布局的参数
}
通过测试非常简单有效,基本达到预期效果,如图:
不足之处:由于手动设置了ListView所在布局的高度,当ListView高度发生变化时,如删除了一条数据。ScrollView不会自动改变高度,控件占据的位置依然存在,如图。
接下来我们将介绍另外一种更为好用的解决方法,参见:
参考资料:Stack Overflow上的一篇帖子
原文链接:http://www.67tgb.com/?p=470
欢迎访问:望月听涛