0

我想测量 a 的高度ListView并在加载一些数据后扩展它。ListAdapter 根据数据的类型为项目选择不同的布局。

我试过这段代码:

public class ExpandedListView extends ListView {

[...]

@Override
protected void onDraw(Canvas canvas) {
    if (getCount() != 0) {
        params = getLayoutParams();
        int height = 0;
        for (int i = 0; i < getCount(); i++) {
            height += getChildAt(i).getMeasuredHeight();
            height += getDividerHeight();
        }
        params.height = height;
        setLayoutParams(params);
    }

    super.onDraw(canvas);
}

[...]

但我得到一个 NullPointerExceptiongetChildAt(i)

07-29 09:48:08.745: E/AndroidRuntime(21298): FATAL EXCEPTION: main
07-29 09:48:08.745: E/AndroidRuntime(21298): java.lang.NullPointerException
07-29 09:48:08.745: E/AndroidRuntime(21298):    at com.app.ExpandedListView.onDraw(ExpandedListView.java:24)
07-29 09:48:08.745: E/AndroidRuntime(21298):    at android.view.View.draw(View.java:13719)

只有一个孩子可以访问,但 getCount() 给我的值是 38。这个问题的一些其他解决方案将 getCount() 乘以第一个孩子的高度为 0。但我的项目有不同的高度。

//params.height = getCount() * (old_count > 0 ? getChildAt(0).getHeight() : 0);

这对我来说没有解决办法。我怎样才能收到我的 ListView 的真实高度?

编辑:为了更好地理解:我的活动中有视差效果。一个 ScrollView 包含一个 ImageView 作为一个 Header 和一个 ListView 下面。ImageView 的滚动速度比 ListView 慢一点。因此,由于 ScrollView-Parent,我不能使用普通的 ListView。 在此处输入图像描述

LinearLayout 是没有选择的,因为它与 TextViews 组合的行为是错误的,并且所有 TextViews 的最大高度为 2 行。

4

1 回答 1

0

尝试这个,

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

    int desiredWidth = MeasureSpec.makeMeasureSpec(
            listView.getWidth(), MeasureSpec.UNSPECIFIED);
    int desiredHeight = MeasureSpec.makeMeasureSpec(
            listView.getHeight(), MeasureSpec.UNSPECIFIED);
    int totalHeight = 0;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View view = listAdapter.getView(i, null, listView);
        view.measure(desiredWidth, desiredHeight);
        totalHeight += view.getMeasuredHeight();
    }
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
}
于 2016-08-10T13:04:10.483 回答