ListView
の実装がレイアウト全体を実行しない可能性があるため、ViewTreeObserver
実際に進行中のレイアウトが表示されることはありません。
私が知らない特定の電話ケースがない限り、Viewsのpost
メソッドを使用して、Viewsが表示されているときにrunnableを実行できます。
mDetailsView.post(new Runnable() {
@Override
public void run() {
onClickListener.setHeight(mDetailsView.getHeight());
mDetailsView.setVisibility(View.GONE);
}
});
編集:
getView()
メソッド全体がどのようにレイアウトされているのかわかりません。問題は、私が推測しなければならないのであれば、ListView
単にレイアウトを要求していないということです。代わりに、ビューごとに作業自体を実行して、処理を高速化します。あなたが試すことができるのはこれです:
public void getView(int position, View convertView, ViewGroup parent) {
/*
* set your view up
*/
mDetailsView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mDetailsView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
onClickListener.setHeight(mDetailsView.getHeight());
mDetailsView.setVisibility(View.GONE);
}
});
notifyDataSetInvalidated(); // Notify the ListView() and any other listeners that your views are invalid.
return view;
}
新しい編集:notifyDataSetInvalidated()
通常は悪い考えで使用し、特にで使用する場合はgetView()
。
レイアウトを事前に測定するには、レイアウトパラメータを取得するか、存在しない場合は新しいパラメータを指定します。
LayoutParams params = newView.getLayoutParams();
if (params == null) {
params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}
final int widthSpec = MeasureSpec.makeMeasureSpec(parent.getWidth(), MeasureSpec.UNSPECIFIED);
final int heightSpec = MeasureSpec.makeMeasureSpec(parent.getHeight(), MeasureSpec.UNSPECIFIED);
newView.measure(widthSpec, heightSpec);