关于ListView和ScrollView冲突问题的解决方案

来源:互联网 发布:怎么下载淘宝助理5.5 编辑:程序博客网 时间:2024/06/07 10:28

有时,我们会遇到这样的情况:在一个布局里既有ListView,又有ScrollView,且ScrollView包含ListView,这是会出现数据显示不全,最多可能只显示1~2条的情况。(注:通常,ScrollView里边包含列表视图或网格视图时,也都会出现冲突问题。)

该如何解决这个问题呢?

首先,要知道ScrollView的关键点--滚动视图,只能容纳一个子控件,通常放线性布局

这里,给出2种解决方案:

第一种:

1、重写ListView的onMeasure函数
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int specHeight = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, specHeight);
}

2、解决默认显示listView顶部的问题
mListView.setFocusable(false);

这是代码量最少的一种处理方式,用的是自定义的listView方式,复写onMeasure()

重新计算了高度。


第二种:

在设置Adapter后,重新调用下面的方法计算ListView的高度。

注:该方法要求子项根布局必须是线性布局

关键代码:
public void setListViewHeight(ListView listView){
ListAdapter adapter = listView.getAdapter();
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 = listItem.getLayoutParams();
params.height = totalHeight + (listItem.getDividerHeight() *  (adapter.getCount()-1));
listView.setLayoutParams(params);

}

写一个方法,用来接收列表视图控件,该方法里要做的事:将高度重新计算一下,并将其高度设置给列表视图,获取列表视图的适配器。



1 0