len:5019
len:15
len:6
zz22zz技术论坛
首页| 论坛| 消息
主题:ScrollView嵌套ListView或者GridView导致高度无法计算的Bug解决办法
太史慈发表于 2013-08-19 09:51
很久以前发了一个问答贴,关于ScrollView里面嵌套了ListView导致高度无法计算的Bug,发现到现在也有很多朋友遇到这样的问题,在此整理下解决方法。
1.此方法是国外牛人写的,只需要调用此方法就可以了,但是此方法有两个Bug,第一个就是Item的布局根标签必须是LinearLayout,第二个就是在Item里面如果TextView换行了以后高度也无法精确计算。代码如下:

/**
* 设置ListView高度自适应
* ListView item必须是LinearLayout
* 其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常
*/
public static void setListViewHeightBasedOnChildren(Activity activity, int res) {
ListView listView = (ListView) activity.findViewById(res);
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
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();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
2.重写ListView或GridView,使ListView失去滑动性,代码如下:
/**
* ScrollView和LsitView嵌套后高度无法计算,所以重写ScrollView,使其失去滑动
*/
public class NoScrollListView extends ListView {

public NoScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, mExpandSpec);
}

}
事实证明,第二种方法是比较完美的。
回帖(0):

全部回帖(0)»
最新回帖
收藏本帖
发新帖