web-dev-qa-db-ja.com

Android:ListViewの全高を測定する方法

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倍です。

前もって感謝します。

edit1:

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

22
Cristiano

ついにやった!これは、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();

}
52
Cristiano

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

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

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

3
lokoko

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

ListView全体を測定することは、すべてのListItemをレンダリングすることを意味します。

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

0
Thibault D.