22

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

問題は、受け取るべきよりも高い身長を受け取っていることです。すべてのリスト項目は異なる方法で測定され、すべての項目の高さが同じであるため、絶対にそうすべきではありません。各要素の高さは、実際の高さの少なくとも 2 倍です。

前もって感謝します。

編集1:

私は 2 つの ListViews を持っており、どちらにも 6 ~ 7 個の EditText フィールドを持つアイテムがあります。ユーザーが EditText に値を書き込み/削除したい場合は、ListView を表示/非表示にします。リストを表示したい場合を除いて、すべてがうまく機能します。メソッドで計算されたListViewには多くのスペースが必要なため、多くのスペースが必要です。そのため、その ListView の下に空きスペースがたくさんあります。必要な空きスペースの 3 倍のように。

4

3 に答える 3

53

やっとやりました!これは、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();

}
于 2013-02-24T17:02:28.573 に答える
3

このようなことを試してください:

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

これを確認することもできます:リストビューのサイズを計算するか、完全に展開するように指示する方法

于 2013-02-23T12:16:49.283 に答える
0

ListViewは、ビューアイテムをキャッシュし、それらを再利用します。1000個のアイテムが表示され、6個しか表示されないリストビューがある場合、なぜ、994を表示しないようにする価値はありません。

ListView全体を測定することは、すべてのListItemをレンダリングすることを意味し、少しやり過ぎのようです。

あなたが何を達成しようとしているのかわかりませんが、おそらくもっと良い方法があります:)

于 2013-02-23T11:31:23.263 に答える