0

ListViewa の高さを測定し、データを読み込んだ後に展開したいと考えています。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);
}

[...]

しかし、私はNullPointerExceptionを取得しますgetChildAt(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)

アクセスできる子は 1 つだけですが、getCount() の値は 38 です。この問題に対する他の解決策では、getCount() に最初の子の高さ 0 を乗算します。しかし、項目の高さが異なります。

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

それは私にとって解決策ではありません。ListView の実際の高さを取得するにはどうすればよいですか?

編集: 理解を深めるために: アクティビティに視差効果があります。ScrollView には、ヘッダーとして ListView の下に ImageView が含まれています。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 に答える