如何计算android中listView的总行高?

时间:2013-07-12 14:18:34

标签: android listview

我使用此代码获取listview行项的总高度,但它没有返回实际高度。这是使用过的代码

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

        int totalHeight = 0;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }

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

例如:我有一个包含20行的列表视图,每行高度彼此不同,假设为200,300,500。当我使用上面的代码时,它没有为我返回实际高度。我也尝试了这个答案:Android: How to measure total height of ListView 但没有用。我怎样才能摆脱这个问题。谁能解释这个解决方案?

1 个答案:

答案 0 :(得分:6)

View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();

该功能的核心是这三行,它试图测量每个视图。 listItem.measure(0,0)中的0等于MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)

大多数情况下,它会计算列表视图的准确高度。有一个例外,当视图内容太多并且将换行时,即有多行文本。在这种情况下,您应该指定一个准确的widthSpec来测量()。因此,请将listItem.measure(0, 0)更改为

// try to give a estimated width of listview
int listViewWidth = screenWidth - leftPadding - rightPadding; 
int widthSpec = MeasureSpec.makeMeasureSpec(listViewWidth, MeasureSpec.AT_MOST);
listItem.measure(listViewWidth, 0)

更新此处的公式

int listViewWidth = screenWidth - leftPadding - rightPadding; 

这只是一个示例,展示如何估计listview宽度的宽度,该公式基于width of listview ≈ width of screen的事实。填充由你自己设置,这里可能为0。 This page告诉我们如何获得屏幕宽度。 一般来说,它只是一个示例,您可以在此处编写自己的公式。