ScrollView 嵌套ListView 解决方案


     方法一:重写ListView的onMeasure
    
 public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
          int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
          super.onMeasure(widthMeasureSpec, expandSpec);
     }


  方法二:重新计算ListView的高度
          public void setListViewHeightBasedOnChildren(ListView listView) {
          // 获取ListView对应的Adapter
          ListAdapter listAdapter = listView.getAdapter();
          if (listAdapter == null) {
               return;
          }

          int totalHeight = 0;
          for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
               // listAdapter.getCount()返回数据项的数目
               View listItem = listAdapter.getView(i, null, listView);
               // 计算子项View 的宽高
               listItem.measure(0, 0);
               // 统计所有子项的总高度
               totalHeight += listItem.getMeasuredHeight();
          }

          ViewGroup.LayoutParams params = listView.getLayoutParams();
          params.height = totalHeight
                    + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
          // listView.getDividerHeight()获取子项间分隔符占用的高度
          // params.height最后得到整个ListView完整显示需要的高度
          listView.setLayoutParams(params);
     }

补充:TextView有换行的时候,TextView的高度可能显示不准确,需要重新计算TextView的高度
代码有
[java] view plaincopy 
    @Override 
         protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
             super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
       
             Layout layout = getLayout(); 
             if (layout != null) { 
                 int height = (int)FloatMath.ceil(getMaxLineHeight(this.getText().toString())) 
                         + getCompoundPaddingTop() + getCompoundPaddingBottom(); 
                 int width = getMeasuredWidth();             
                 setMeasuredDimension(width, height); 
             } 
         } 
       
         private float getMaxLineHeight(String str) { 
             float height = 0.0f; 
             float screenW = ((Activity)context).getWindowManager().getDefaultDisplay().getWidth(); 
             float paddingLeft = ((LinearLayout)this.getParent()).getPaddingLeft(); 
             float paddingReft = ((LinearLayout)this.getParent()).getPaddingRight(); 
             //这里具体this.getPaint()要注意使用,要看你的TextView在什么位置,这个是拿TextView父控件的Padding的,为了更准确的算出换行 
              int line = (int) Math.ceil( (this.getPaint().measureText(str)/(screenW-paddingLeft-paddingReft)));
              height = (this.getPaint().getFontMetrics().descent-this.getPaint().getFontMetrics().ascent)*line; 
              return height;
     } 


上面的代码完成更能为,在ListView开始测量时,测量到TextView时,就调用我们的onMeasure方法,我们就可以测量字体的总宽度除与去掉边距的屏幕的大小,就可以算出文字要几行来显示,然后测量字体的高度*行数可以得到字体的总高度,然后在加上上下边距就是TextView真正的高度,然后setMeasuredDimension进去就可以计算出正确的值出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值