22

我需要测量 ListView 的总高度,但似乎我经常得到错误的值。我正在使用这段代码:

public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        return;
    }

    int totalHeight = 0;
    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(),
            MeasureSpec.AT_MOST);
    Log.w("DESIRED WIDTH", String.valueOf(listAdapter.getCount()));
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
        totalHeight += listItem.getMeasuredHeight();
        Log.w("HEIGHT"+i, String.valueOf(totalHeight));
    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight
            + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    listView.requestLayout();
}

问题是我收到的高度比我应该收到的要高。每个列表项的测量方式都不同,并且所有项的高度都相同,因此绝对不应该这样做。每个元素的高度至少是其实际高度的两倍。

先感谢您。

编辑1:

我有两个 ListView,它们都有 6-7 个 EditText 字段的项目。如果用户想要在 EditText 中写入/删除值,我会显示/隐藏 ListView。一切都很好,除了当我想显示列表时,它需要很多空间,因为计算 ListView 的方法需要很多空间。因此,我在 ListView 下方有很多空白空间。就像需要的空间增加了三倍。

4

3 回答 3

53

终于我做到了!这是测量 ListView 高度并将 ListView 设置为全尺寸的工作代码:

public static void getTotalHeightofListView(ListView listView) {

    ListAdapter mAdapter = listView.getAdapter();

    int totalHeight = 0;

    for (int i = 0; i < mAdapter.getCount(); i++) {
        View mView = mAdapter.getView(i, null, listView);

        mView.measure(
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),

                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

        totalHeight += mView.getMeasuredHeight();
        Log.w("HEIGHT" + i, String.valueOf(totalHeight));

    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight
            + (listView.getDividerHeight() * (mAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    listView.requestLayout();

}
于 2013-02-24T17:02:28.573 回答
3

尝试这样的事情:

listItem.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

  public void onGlobalLayout() {
    int listItemHeight = listItem.getHeight();
  }
});

如果您想要 listView 的高度,请尝试以下操作:

listView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

  public void onGlobalLayout() {
    int listViewHeight = listView.getHeight();
  }
});

你也可以检查一下:计算列表视图的大小或如何告诉它完全展开

于 2013-02-23T12:16:49.283 回答
0

ListView 缓存视图项并重用它们。如果您有一个包含 1000 个项目但只有 6 个可见的列表视图,为什么,不值得渲染 994 不显示。

测量整个 ListView 意味着渲染每个 ListItem,似乎有点矫枉过正。

我不知道您要达到什么目标,但可能有更好的方法:)

于 2013-02-23T11:31:23.263 回答