私が行っているのはListViewです。その ListView は、アダプターを使用して、ViewPager を 1 つだけ含む RelativeLayout を拡張します。
アダプターの getView では、ViewPager に対してカスタム PagerAdapter がインスタンス化され、ViewPager に対して .setAdapter が呼び出されます。setAdapter が呼び出された直後に、行を返すか、ビューを返します。これで、ListView 内のそのアダプターの getView メソッドが終了します。
私が実装したPagerAdapterで
public Object instantiateItem(View collection, int position) {}
これは基本的に、Pager Adapter の子ビュー (ページ) を設定するものです。すべての子ビューの膨張と設定を行い、ビューをコレクションに追加します。
問題は、行で返された後、PagerAdapter がまだ子の設定を完了していないという事実にあると思います。そのため、ListView は ViewPager が空であると判断し、そのように画面に描画します。私がやったことは、基本的にハックだと思うことです。
次のようなものを使用して、instantiateItem の最初の子ビューを測定しようとします。
view.measure(MeasureSpec.makeMeasureSpec(widthMeasureSpecSize, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(heightMeasureSpecSize, MeasureSpec.UNSPECIFIED));
((Pager) collection).requestedHeight = view.getMeasuredHeight();
値 heightMeasureSpecSize は実際には、.setAdapter が呼び出される前に listView アダプターによって設定されるパブリック プロパティです。値が設定される前のデフォルトは 100 です。次に、次のように onMeasure メソッドをオーバーライドしました。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
super.onMeasure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(requestedHeight, View.MeasureSpec.AT_MOST));
}
このすべてのコードで、アプリケーションを実行すると、ViewPager で onMeasure が呼び出されるたびに、ListView は ViewPager を 100 でリストに追加し、onMeasure を使用して再計算し、最初の子の測定された高さを使用してアイテムを再描画するようですビューページャー....
これはすべて、ViewPager で wrap_content が壊れているためです。おそらくこれを行うよりも良い方法はありますか?それはひどく非効率的なようです。