簡體   English   中英

ListView中的ViewPager - 動態測量高度(適配器中的WRAP_CONTENT膨脹)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM