论坛风格切换
  • 2903阅读
  • 0回复

ScrollView嵌套ListView或者GridView导致高度无法计算的Bug解决办法 [复制链接]

上一主题 下一主题
离线太史慈
 

发帖
766
金币
626
威望
556
只看楼主 倒序阅读 使用道具 楼主  发表于: 2013-08-19
很久以前发了一个问答贴,关于ScrollView里面嵌套了ListView导致高度无法计算的Bug,发现到现在也有很多朋友遇到这样的问题,在此整理下解决方法。

1.此方法是国外牛人写的,只需要调用此方法就可以了,但是此方法有两个Bug,第一个就是Item的布局根标签必须是LinearLayout,第二个就是在Item里面如果TextView换行了以后高度也无法精确计算。代码如下:


  1. /**
  2.          * 设置ListView高度自适应
  3.          * ListView item必须是LinearLayout
  4.          * 其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常
  5.          */
  6.         public static void setListViewHeightBasedOnChildren(Activity activity, int res) {
  7.                 ListView listView = (ListView) activity.findViewById(res);
  8.                 ListAdapter listAdapter = listView.getAdapter();
  9.                 if (listAdapter == null) {
  10.                         // pre-condition
  11.                         return;
  12.                 }
  13.                 int totalHeight = 0;
  14.                 for (int i = 0; i < listAdapter.getCount(); i++) {
  15.                         View listItem = listAdapter.getView(i, null, listView);
  16.                         listItem.measure(0, 0);
  17.                         totalHeight += listItem.getMeasuredHeight();
  18.                 }
  19.                 ViewGroup.LayoutParams params = listView.getLayoutParams();
  20.                 params.height = totalHeight
  21.                                 + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
  22.                 listView.setLayoutParams(params);
  23.         }

2.重写ListView或GridView,使ListView失去滑动性,代码如下:
  1. /**
  2. * ScrollView和LsitView嵌套后高度无法计算,所以重写ScrollView,使其失去滑动
  3. */
  4. public class NoScrollListView extends ListView {
  5.         
  6.         public NoScrollListView(Context context, AttributeSet attrs) {
  7.                 super(context, attrs);
  8.         }
  9.         public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  10.                 int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
  11.                                 MeasureSpec.AT_MOST);
  12.                 super.onMeasure(widthMeasureSpec, mExpandSpec);
  13.         }
  14. }

事实证明,第二种方法是比较完美的。
[url=http://www.phpwind.com]phpwind[/url]
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
提到某人:
选择好友
上一个 下一个