如何正确获得ListView的每一个item高度

来源:互联网 发布:魔镜淘宝助手插件 编辑:程序博客网 时间:2024/05/10 05:23

如何正确获得ListView的每一个item高度

最近Android中使用ListView 需要动态获取每个item的高度 来计算ListView的高度,计算过程中碰到一些问题,特此分享

前提 这个item的根view必须是LinearLayout

package com.bxg.news.view;import android.view.View;import android.view.ViewGroup;import android.widget.ListAdapter;import android.widget.ListView;public class Utility { public static void setListViewHeightBasedOnChildren(ListView listView,   View v) {  // 获取ListView对应的Adapter  ListAdapter listAdapter = listView.getAdapter();  if (listAdapter == null) {   // pre-condition   return;  }  int totalHeight = 0;  for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目   View listItem = listAdapter.getView(i, null, listView);   listItem.measure(0, 0); // 计算子项View 的宽高   totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度  }  if (v != null) {   totalHeight += v.getHeight();  }  ViewGroup.LayoutParams params = listView.getLayoutParams();  params.height = totalHeight    + (listView.getDividerHeight() * (listAdapter.getCount() - 1))    + 10;  // listView.getDividerHeight()获取子项间分隔符占用的高度  // params.height最后得到整个ListView完整显示需要的高度  listView.setLayoutParams(params); }}

这里需要注意的是:
如果TextView是多行的时候。需要对TextView进行重写onmeasure方法

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 = ((RelativeLayout) this.getParent())    .getPaddingLeft();  float paddingReft = ((RelativeLayout) 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; }
3 0