ViewPager + PagerAdapter在显示第一、二个项目后显示空白页面

6
正在发生的事情: 前两个ViewPager页面已经很好地加载了(ViewPager会自动加载当前页面前后+-1的页面)。当你滚动到这些页面之后,下一个页面没有显示出来。问题的GIF演示如下。 调试信息: 页面已经被实例化(见下面的代码),并已成功添加到ViewPager的ArrayList<ItemInfo>mItems中(通过日志消息确认)。我重新编译了启用debug=true的android.support.v4库(在aosp中执行 mmm frameworks/support/v4/),它展示了除以下情况外一切正常:
在第一次加载了两个视图之后,ViewPager中的onLayout和onMeasure方法停止被调用。这意味着其他页面是黑色的,因为它们从未被测量&排列过。我尝试在不同的点添加不同的requestLayout()调用来强制刷新布局树,但都没有成功。 背景: 我通过inflater.inflate进行实例化的ViewPager,在view.findViewById(R.layouy.myid)中找到。它直接替换了旧的Gallery视图,并且为了测试目的,PagerAdapter的instantiateItem(collection, position)只是做了这个:
@Override
public Object instantiateItem(View collection, final int position) {
    final TextView tv = new TextView(collection.getContext());
    tv.setText("Looking at page " + position);
    tv.setTextColor(Color.WHITE);
    tv.setBackgroundColor(Color.rgb( (int)(Math.random()*100), (int)(Math.random()*100), (int)(Math.random()*100)));
    tv.setTextSize(22);
    ((ViewPager) collection).addView(tv);
    return tv;
}

有什么想法吗?在我看来,PageView的父级中的某些神秘设置可能会禁用onLayout PageView。

你在适配器中实现了destroyItem吗?http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#destroyItem(android.view.ViewGroup, int, java.lang.Object) - Salil Pandit
是的,正如建议的那样:destroyItem(View c, int p, Object v) {((ViewPager)c).removeView((View)v); },在我的测试应用程序中它完美地工作。 - Tim O'Brien
2
我遇到了类似的问题。你的解决方案对我不起作用。你能帮我吗? - Gaurav Arora
1个回答

11

找到了我的问题。在我的视图的父级的父级中,有人对LinearLayout进行了子类化,并重写了requestLayout()而没有调用super.requestLayout()

这破坏了我的视图层次结构的刷新,并防止了对我的ViewPager调用onMeasure和onLayout。如果没有测量和布局页面,它们会在ViewPager中显示为空白。

希望这能帮助其他人。对我来说,确实花了很长时间才找出问题所在。

专业提示:android-sdk/tools/hierarchyviewer不可思议的。感谢Android团队。每个人都应该至少运行一次,它可以在调试和设计任何UI时具有无价值的作用。


现在监视器已经过时了吗? - Gun2sh
命令行版本是可以的,但 Android 设备监视器的版本不行。 - Neeko

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