zoukankan      html  css  js  c++  java
  • ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法(转)

    ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法

    分类: android应用开发

    1、前言

    从谷歌那里找到的ScrollView嵌套ListView只显示一行的解决办法相信很多人都遇到过,然后大部分都是用这位博主的办法解决的吧

    刚开始我也是用这个办法解决的,首先感谢这位哥的大私奉献,贴上地址

    http://blog.csdn.net/p106786860/article/details/10461015

    2、解决的核心代码

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. public void setListViewHeightBasedOnChildren(ListView listView) {     
    2.         // 获取ListView对应的Adapter     
    3.         ListAdapter listAdapter = listView.getAdapter();     
    4.         if (listAdapter == null) {     
    5.             return;     
    6.         }     
    7.      
    8.         int totalHeight = 0;     
    9.         for (int i = 0, len = listAdapter.getCount(); i len; i++) {     
    10.             // listAdapter.getCount()返回数据项的数目     
    11.             View listItem = listAdapter.getView(i, null, listView);     
    12.             // 计算子项View 的宽高     
    13.             listItem.measure(0, 0);      
    14.             // 统计所有子项的总高度     
    15.             totalHeight += listItem.getMeasuredHeight();      
    16.         }     
    17.      
    18.         ViewGroup.LayoutParams params = listView.getLayoutParams();     
    19.         params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));     
    20.         // listView.getDividerHeight()获取子项间分隔符占用的高度     
    21.         // params.height最后得到整个ListView完整显示需要的高度     
    22.         listView.setLayoutParams(params);     
    23.     }     
    这个代码让控件去计算Listview自己的高度然后设置这个Listview的高度

    但是这个代码里面有一个问题,就是这个当你的ListView里面有多行的TextView的话,ListView的高度就会计算错误,它只算到了一行TextView的高度,

    这个问题在so上的概述为以下:

    http://stackoverflow.com/questions/14386584/getmeasuredheight-of-textview-with-wrapped-text

    3、终极解决办法

    这个问题头疼了一阵后,查找了一下,应该重写一个TextView的onMeasure方法比较好解决

    代码有

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. @Override  
    2.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
    3.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
    4.   
    5.         Layout layout = getLayout();  
    6.         if (layout != null) {  
    7.             int height = (int)FloatMath.ceil(getMaxLineHeight(this.getText().toString()))  
    8.                     + getCompoundPaddingTop() + getCompoundPaddingBottom();  
    9.             int width = getMeasuredWidth();              
    10.             setMeasuredDimension(width, height);  
    11.         }  
    12.     }  
    13.   
    14.     private float getMaxLineHeight(String str) {  
    15.         float height = 0.0f;  
    16.         float screenW = ((Activity)context).getWindowManager().getDefaultDisplay().getWidth();  
    17.         float paddingLeft = ((LinearLayout)this.getParent()).getPaddingLeft();  
    18.         float paddingReft = ((LinearLayout)this.getParent()).getPaddingRight();  
    19. //这里具体this.getPaint()要注意使用,要看你的TextView在什么位置,这个是拿TextView父控件的Padding的,为了更准确的算出换行  
    20.  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进去就可以计算出正确的值出来。
  • 相关阅读:
    153. Find Minimum in Rotated Sorted Array
    228. Summary Ranges
    665. Non-decreasing Array
    661. Image Smoother
    643. Maximum Average Subarray I
    4.7作业
    面向对象编程
    常用模块3
    3.31作业
    常用模块2
  • 原文地址:https://www.cnblogs.com/zmc/p/4013053.html
Copyright © 2011-2022 走看看