[英]ViewPager in ListView - Measure Height Dynamically (WRAP_CONTENT inflated in Adapter)
我發生的是一個ListView。 ListView使用適配器來擴充僅包含一個ViewPager的RelativeLayout。
在適配器的getView中,為ViewPager實例化自定義PagerAdapter,為ViewPager調用.setAdapter。 在調用setAdapter之后我做了一個返回行或返回視圖; 這結束了ListView中該適配器的getView方法。
在我已經實現的PagerAdapter中
public Object instantiateItem(View collection, int position) {}
這基本上是為尋呼機適配器設置子視圖(頁面)的內容。 它會對所有子視圖進行充氣和設置,然后將視圖添加到集合中。
我認為問題在於,在行中返回后,PagerAdapter仍然沒有完成設置子節點,因此ListView認為ViewPager是空的並以這種方式將其繪制到屏幕上。 我所做的就是我認為基本上是黑客攻擊。
我嘗試使用以下內容測量instantiateItem中的第一個子視圖:
view.measure(MeasureSpec.makeMeasureSpec(widthMeasureSpecSize, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(heightMeasureSpecSize, MeasureSpec.UNSPECIFIED));
((Pager) collection).requestedHeight = view.getMeasuredHeight();
值heightMeasureSpecSize實際上是一個公共屬性,它由listView適配器在.setAdapter調用之前設置((Pager)集合).requestedHeight是我在擴展它時在ViewPager上做的另一個屬性。 在設置值之前默認為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添加到列表中,然后使用onMeasure重新計算並使用第一個子節點的measuredHeight重繪項目。查看傳呼機......
所有這一切都是因為在ViewPager中破壞了wrap_content。 有可能比這樣做更好嗎? 這看起來非常低效。
這是我的解決方案:
ViewTreeObserver viewTreeObserver = mViewPager.getViewTreeObserver();
viewTreeObserver
.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
int viewPagerWidth = mViewPager.getWidth();
float viewPagerHeight = (float) (viewPagerWidth * FEATURED_IMAGE_RATIO);
layoutParams.width = viewPagerWidth;
layoutParams.height = (int) viewPagerHeight;
mViewPager.setLayoutParams(layoutParams);
mViewPager.getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
}
});
我測量然后調整高度。 希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.