计算android中listView的总行高

时间:2014-03-13 07:24:23

标签: android listview android-listview

我在ListView内使用ScrollView并且我们都知道它会产生问题。

我从这个网站得到了很好的解决方案:How to calculate total row heights of listView in android?

但是对于某些项目,它没有正确显示Listview。有没有改进的解决方案?

我的代码:

     public static void getListViewSize(ListView myListView, Context context) {
        ListAdapter myListAdapter = myListView.getAdapter();

        if (myListAdapter == null) {
            return;
        }

        int totalHeight = 0;
        for (int size = 0; size < myListAdapter.getCount(); size++) {

            View listItem = myListAdapter.getView(size, null, myListView);
            if (listItem instanceof ViewGroup)
                listItem.setLayoutParams(new RelativeLayout.LayoutParams(
                        RelativeLayout.LayoutParams.WRAP_CONTENT,
                        RelativeLayout.LayoutParams.WRAP_CONTENT));

            WindowManager wm = (WindowManager) context
                    .getSystemService(Context.WINDOW_SERVICE);
            Display display = wm.getDefaultDisplay();
            @SuppressWarnings("deprecation")
            int screenWidth = display.getWidth();
            int listViewWidth = screenWidth - 20;
            int widthSpec = MeasureSpec.makeMeasureSpec(listViewWidth,
                    MeasureSpec.AT_MOST);
            listItem.measure(widthSpec, 0);

            totalHeight += listItem.getMeasuredHeight();

            Log.e("height of listItem:", String.valueOf(totalHeight));
        }

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

1 个答案:

答案 0 :(得分:0)

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; 
enter code here

这只是一个示例,展示如何估计listview宽度的宽度,该公式基于listview的宽度≈屏幕宽度这一事实。填充由你自己设置,这里可能为0(Get screen dimensions in pixels)。此页面说明如何获得屏幕宽度。一般来说,它只是一个样本,您可以在这里编写自己的公式。