我正在做的是一个列表视图。该ListView使用适配器为仅包含一个ViewPager的RelativeLayout充气。
在适配器的getview中,为viewpager实例化自定义pageradapter,为viewpager调用.setadapter。在调用setadapter之后,我会执行一个返回行或返回视图;这会在listview中结束该适配器的getview方法。
在PageRadapter中我实现了

public Object instantiateItem(View collection, int position) {}

这基本上就是为寻呼机适配器设置子视图(页面)的原因。它将展开并设置所有子视图,然后将该视图添加到集合中。
我认为问题在于,在行中完成返回之后,pageradapter仍然没有完成设置子项,因此listview认为viewpager是空的,并以这种方式将其绘制到屏幕上。我所做的是我认为基本上是一个黑客。
我尝试使用如下方法测量instantiatetem中的第一个子视图:
view.measure(MeasureSpec.makeMeasureSpec(widthMeasureSpecSize, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(heightMeasureSpecSize, MeasureSpec.UNSPECIFIED));
((Pager) collection).requestedHeight = view.getMeasuredHeight();

HeightMeasureSpecSize值实际上是一个公共属性,它是由ListView适配器之前设置的。
((寻呼机)集合).requestedheight是我在扩展viewpager时在viewpager本身上创建的另一个属性。在设置值之前,它默认为100。然后我重写onMeasure方法,如下所示:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    super.onMeasure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(requestedHeight, View.MeasureSpec.AT_MOST));
}

使用所有这些代码,当我运行应用程序时,每当在view pager上调用onmeasure时,list view似乎会将viewpager添加到100的列表中,然后使用onmeasure重新计算并使用viewpager的第一个子级的measuredheight重新绘制项….
所有这些都是因为包装内容在viewpager中被破坏。有比这更好的办法吗?它看起来效率极低。

最佳答案

这是我的解决方案:

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

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

10-07 19:41
查看更多