我正在处理的是一个ListView。该ListView使用适配器来充气RelativeLayout,该RelativeLayout仅包含一个ViewPager。
在适配器的getView方法中,为ViewPager实例化了自定义PagerAdapter,并为ViewPager调用了.setAdapter。在调用setAdapter之后,我立即返回row或view。这结束了ListView中适配器的getView方法。
在PagerAdapter中,我已经实现了……
这基本上是为Pager Adapter设置子视图(页面)的过程。它会进行充气和设置所有子视图,然后将视图添加到集合中。
我认为问题在于,在行中完成返回后,PagerAdapter仍未完成设置子项,因此ListView认为ViewPager为空,并以此方式绘制屏幕。我所做的就是一种hack方法。
我尝试在instantiateItem中测量第一个子视图,使用类似于以下内容的东西:
在适配器的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存在问题。是否有比这个更好的方法?这似乎非常低效。