ListView中的ViewPager - 动态测量高度(在适配器中使用WRAP_CONTENT)

3
我正在处理的是一个ListView。该ListView使用适配器来充气RelativeLayout,该RelativeLayout仅包含一个ViewPager。
在适配器的getView方法中,为ViewPager实例化了自定义PagerAdapter,并为ViewPager调用了.setAdapter。在调用setAdapter之后,我立即返回row或view。这结束了ListView中适配器的getView方法。
在PagerAdapter中,我已经实现了……
public Object instantiateItem(View collection, int position) {}

这基本上是为Pager Adapter设置子视图(页面)的过程。它会进行充气和设置所有子视图,然后将视图添加到集合中。
我认为问题在于,在行中完成返回后,PagerAdapter仍未完成设置子项,因此ListView认为ViewPager为空,并以此方式绘制屏幕。我所做的就是一种hack方法。
我尝试在instantiateItem中测量第一个子视图,使用类似于以下内容的东西:
view.measure(MeasureSpec.makeMeasureSpec(widthMeasureSpecSize, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(heightMeasureSpecSize, MeasureSpec.UNSPECIFIED));
((Pager) collection).requestedHeight = view.getMeasuredHeight();

heightMeasureSpecSize实际上是一个公共属性,在调用.setAdapter之前由listView适配器设置。 ((Pager) collection).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添加到列表中,并使用100重新计算,然后使用View Pager的第一个子项的measuredHeight重绘该项....

所有这些都是因为ViewPager中的wrap_content存在问题。是否有比这个更好的方法?这似乎非常低效。


我解决了自己的问题。离开这个问题几天后,在回家的路上想到了解决方案。所有视图都需要同时膨胀。ViewPager及其所有子项。在第一个子项被膨胀后,测量它,然后将布局参数设置为ViewPager相同。它会起作用。 - Issa Fram
1个回答

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接