|
很久以前发了一个问答贴,关于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);
- }
-
- }
事实证明,第二种方法是比较完美的。
|