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倍の空きスペースが必要です。
ついにやった!これは、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();
}
このようなものを試してください:
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();
}
});
これも確認できます: リストビューのサイズを計算するか、完全に展開するように指示する方法
ListViewはビューアイテムをキャッシュし、再利用します。 1000個のアイテムと6個しか表示されていないリストビューがある場合、994が表示されないようにする必要はありません。
ListView全体を測定することは、すべてのListItemをレンダリングすることを意味します。
あなたが何を達成しようとしているのかわかりませんが、おそらくもっと良い方法があります:)