ListView中的ViewPager - 动态测量高度(适配器中的WRAP_CONTENT膨胀)

时间:2012-10-16 04:22:41

标签: android android-layout android-viewpager

我发生的是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实际上是一个公共属性,在调用.setAdapter之前由listView适配器设置 ((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重新绘制项目。 View Pager ....的第一个孩子。

所有这一切都是因为在ViewPager中破坏了wrap_content。有可能比这样做更好吗?这看起来非常低效。

1 个答案:

答案 0 :(得分: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);
                }
            });

我测量然后调整高度。希望它有所帮助。