Android:如何测量 ListView 的总高度 [重复]

Posted

技术标签:

【中文标题】Android:如何测量 ListView 的总高度 [重复]【英文标题】:Android: How to measure total height of ListView [duplicate] 【发布时间】:2013-02-08 23:59:24 【问题描述】:

我需要测量 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 下方有很多空白空间。需要三倍的空白空间。

【问题讨论】:

***.com/questions/2312683/… 谢谢,但这对我不起作用。我想我有这个问题是因为我没有一个 ListView。空间覆盖可能存在一些冲突。 【参考方案1】:

我终于做到了!这是测量 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();


【讨论】:

您应该更改此方法的名称。以“get”开头意味着返回值不是 void。 还需要加上listView.getPaddingTop()和bottom。 还假设您有固定高度的 listView 条目。包含 ViewGroup 的宽度在上述代码中不可用,因为它能够处理可变高度 / layout_ 条目。 单元格高度不同时不起作用 这不起作用【参考方案2】:

试试这样的:

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();
  
);

您也可以查看:Calculate the size of a list view or how to tell it to fully expand

【讨论】:

谢谢,但这对我不起作用。我在第一篇文章中进行了编辑。我认为问题在于多个列表。 如果有人有一个包含具有相同高度的项目的列表,那么我想这样做 list.LayoutParams = new LinearLayout.LayoutParams(fill_parent, thisFixedHeight * Count) 是要走的路。任何地方都没有迭代。真正的问题是有一些东西可以处理列表列表。【参考方案3】:

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

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

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

【讨论】:

我没有那么多项目 :) 我有两个 ListView,它们都有包含 6-7 个 EditText 字段的项目。如果用户想要在 EditText 中写入/删除值,我会显示/隐藏 ListView。一切都很好,除了当我想显示列表时,它需要很多空间,因为计算 ListView 的方法需要很多空间。因此,我在 ListView 下方有很多空白空间。就像需要三倍的空白空间。 但是 ListView 不知道你将如何使用它,所以它是这样写的。如果您希望其中一个列表视图消失并释放屏幕上的空间以供另一个列表填充,请使用 View.setVisibility(View.GONE) 我正在使用View.setVisibility(View.GONE),但是当我再次显示它时,它确实需要很多空间,整个屏幕的空白空间。我正在检查@RobinHood 发布的链接。看来他们设法通过不同的测量来做到这一点。

以上是关于Android:如何测量 ListView 的总高度 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android -- 每日一问:如何解决ScrollView嵌套中一个ListView的滑动冲突?

如何在 Linux 多线程环境中测量函数的总执行时间

如何得到listview的总列数与总行数

快速理解android View的测量onMeasure()与MeasureSpec

转载快速理解android View的测量onMeasure()与MeasureSpec

使用 Java/Android 测量下载速度