ListView嵌套ListView,TextView有多行文本显示不全不问题

来源:互联网 发布:mede2000数据库卸载 编辑:程序博客网 时间:2024/05/17 04:47

这是在网上找到的相关的解决方法,记录下来,方便以后查看。

关于ListView嵌套ListView,在网上找到的解决方法是调用自定义的方法动态计算listview的高度:

public void setListViewHeightBasedOnChildren(ListView listView) {             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);         }     

一开始一直使用这个方法,但是后来发现子listview的TextView显示多行文本时,计算就不准确了,在网上找到了其他的解决方法:

(1)

在listview中实现onMeasure方法:

 @Override      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {          int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  MeasureSpec.AT_MOST);          super.onMeasure(widthMeasureSpec, expandSpec);      }  

测试了一下,发现这个方法是可行的。

(2)重写TextView的onMeature方法:(参考链接:点击打开链接)

@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;}  
这个方法没有测试,先记录下来,以后再看看。



0 1
原创粉丝点击