15

ListViewの高さを測定する必要がありますが、間違った値が常に出ているようです。私はこのコードを使用しています:Android: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つのリストビューを持っており、彼らの両方が6-7のEditTextフィールドを持つアイテムを持っています。 EditTextで値を書き込み/削除したい場合はListViewを表示/非表示にします。リストを表示したい場合を除いて、すべてがうまく動作しますが、ListViewの計算には多くのスペースが必要なため、多くのスペースが必要です。そのため、ListViewの下に空きスペースがたくさんあります。 3倍の空きスペースが必要なほど。

+1

http://stackoverflow.com/questions/2312683/calculate-the-size-of-a-list-view-or- – RobinHood

+0

ありがとうございますが、それは私のためには機能しません。私はListViewが1つしかないのでこの問題があると思います。スペースカバレッジとの競合が考えられます。 – Cristiano

答えて

42

最後にやった!これは、リストビューの高さを測定し、フルサイズでの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(); 

} 
+7

このメソッドの名前を変更する必要があります。 「get」で始めることは、void以外の戻り値を意味します。 –

+0

さらに、このメソッドは実行が非常に遅いため、リスト項目の数が変更された場合にのみ実行することをお勧めします。 –

+4

'listView.getPaddingTop()'とbottomも追加する必要があります。 – njzk2

0

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

ListView全体を測定すると、すべてのListItemがレンダリングされますが、ちょっと残念です。

私はあなたが達成しようとしているのか分からないけど良い方法はおそらくあります:)

+0

私は非常に多くの項目がありません:)私は2つのListViewを持って、彼らは両方が6-7 EditTextフィールドの項目を持っています。 EditTextで値を書き込み/削除したい場合はListViewを表示/非表示にします。リストを表示したい場合を除いて、すべてがうまく動作しますが、ListViewの計算には多くのスペースが必要なため、多くのスペースが必要です。そのため、ListViewの下に空きスペースがたくさんあります。 3倍の空きスペースが必要なほど。 – Cristiano

+0

しかし、ListViewはあなたがそれを使う方法を知らないので、このように書かれています。リストビューの1つを消して画面のスペースを解放して、他のリストを塗りつぶしたい場合は、View.setVisibility(View.GONE)を使用してください。 –

+0

私は 'View.setVisibility(View.GONE)'を使用していますが、私はそれが本当に多くのスペース、空きスペースの画面全体を必要とすることを再度示す。 @RobinHoodが投稿したリンクをチェックしています。彼らはそれを別に測定することによってそれをすることができたようだ。 – Cristiano

2

このような何か試してみてください:

listItem.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    public void onGlobalLayout() { 
    int listItemHeight = listItem.getHeight(); 
    } 
}); 

を使用すると、リストビューの高さをしたい場合は、これを試してください:

listView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    public void onGlobalLayout() { 
    int listViewHeight = listView.getHeight(); 
    } 
}); 

また、これをチェックすることができます:Calculate the size of a list view or how to tell it to fully expand

+0

ありがとうございますが、それは私のためには機能しません。私は最初の投稿で編集しました。私は問題が複数のリストであると思う。 – Cristiano

+0

誰かが同じ高さのアイテムを含むリストを持っている場合、私はlist.LayoutParams = new LinearLayout.LayoutParams(fill_parent、thisFixedHeight * Count)を実行すると思います。どこでも繰り返しはありません。実際の問題は、リストのリストを扱うことです。 –

関連する問題