2012-10-16 33 views
3

我正在做的是一個ListView。該ListView使用適配器來擴充僅包含一個ViewPager的RelativeLayout。ListView中的ViewPager - 動態測量高度(適配器中的WRAP_CONTENT充氣)

在適配器的getView中,自定義的PagerAdapter被實例化爲ViewPager,並且爲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實際上是由.setAdapter前的ListView適配器設置的公共財產被稱爲 的(( Pager)集合).requestedHeight是我在擴展ViewPager時所做的另一個屬性。在設置值之前它默認爲100。然後我overrided像onMeasure方法,以便:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
    super.onMeasure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(requestedHeight, View.MeasureSpec.AT_MOST)); 
} 

這一切的代碼,當我運行的應用程序,每當onMeasure被調用的ViewPager,ListView控件似乎在ViewPager 100,然後重新添加到列表使用onMeasure進行計算並使用視圖尋呼機的第一個孩子的measuredHeight重新繪製該項目....

所有這些都是因爲wrap_content在ViewPager中被破壞。有沒有比這樣做更好的方法?這似乎非常低效。

+0

我解決了我自己的問題。幾天後,遠離這個問題,並在回家的路上想到了解決方案。所有的觀點都需要同時被誇大。 ViewPager及其所有子項。在第一個孩子膨脹後,測量它,然後將ViewPager的佈局參數設置爲相同。它會工作。 –

回答

1

這是我的解決方案:

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); 
       } 
      }); 

我衡量,然後調整高度。希望能幫助到你。