ViewPager 在返回时跳过视图留下空白

Posted

技术标签:

【中文标题】ViewPager 在返回时跳过视图留下空白【英文标题】:ViewPager skip views on return leaving blank 【发布时间】:2013-05-17 03:42:45 【问题描述】:

我正在制作一个有 4 个主要视图的应用程序。我希望它们都停留在顶部的 LIST 菜单上(现在没关系)。

使用 Fragments,我可以更改视图而无需实际进行其他活动,但由于我的一个视图有一个 ViewPager,它根本不起作用(当我第一次加载视图时,内容还可以,但是在第二次,ViewPager 上的视图消失,只有当我离开 2 个索引位置并返回时才会出现(见图片,显示第一次加载时间和第二次)

请注意,ViewPager 不是显示菜单项,它实际上是当前菜单项的 Fragment 的一部分(在本例中为“Simula'c~ao”)

我的问题是:这是一个已知问题,是否有简单的方法来解决它,或者我必须以另一种方式来解决?我已经在互联网上搜索过这个问题,但对我没有任何帮助(无效,设置getItemPosition 以返回POSITION_NONE...)

我查看了 ViewPager 类,一切似乎都很好,我已对其进行了修改,因此每次渲染视图时,它都会强制渲染所有内容,但这种方式都不起作用。

我已尝试将可见性设置为 GONE 和 VISIBLE

我已尝试分离和连接适配器

试图缓存视图,并返回缓存。

似乎奏效的一件事:改变手机的方向。那行得通。

尝试了很多我什至记得的东西......我对此有点愤怒,因为过去的 24 小时根本没有帮助我解决这个“谜团”。我希望你们中的一些人可以=]

我的代码: https://www.dropbox.com/s/u4mlxr3k6ta9yrm/MainActivity.java https://www.dropbox.com/s/2dqfnzjs2wl89hj/SimulationFragment.java

查看次数: https://www.dropbox.com/s/d6ruc1zjovqu6ob/activity_main.xml https://www.dropbox.com/s/lp1iea13klr77iq/activity_simulation.xml https://www.dropbox.com/s/1mkl3jqmo7g4wh8/item_simulation.xml

【问题讨论】:

【参考方案1】:

好吧,经过长时间的努力试图发现这到底是怎么回事,@anup-cowkur 引导我找到了一条可以解决我问题的道路。

一开始我认为问题出在PageView,我下载了支持库,编辑,修改了很多东西,但问题不存在。

其实问题出在FragmentPagerAdapter上。他对每个ViewPager 片段使用一种“缓存”。因此,当我返回视图时,他没有“通知”,导致父视图中显示的最后一个片段不“实际”存在(在这种情况下,主片段,它包含 ViewPager 中的其他片段)。

由于它们是在 FragmentManager 上注册的,我所做的就是侵入 FragmentPagerAdapter,实现此方法:

FragmentPagerAdapter.java

public void clear(ViewGroup container)
    if (mCurTransaction == null) 
        mCurTransaction = mFragmentManager.beginTransaction();
    

    for(int i = 0; i < getCount(); i++)

        final long itemId = getItemId(i);

        // Do we already have this fragment?
        String name = "android:switcher:" + container.getId() + ":" + itemId;
        Fragment fragment = mFragmentManager.findFragmentByTag(name);

        if(fragment != null)
            mCurTransaction.detach(fragment);
        
    
    mCurTransaction.commitAllowingStateLoss();
    mCurTransaction = null;

然后,在我的“onCreate”上调用它:

myPagerAdapter.clear(mViewPager);

完成。所有片段都被强制从 FragmentManager 中删除,导致“缓存”消失。

这不是最好的解决方案,但却是唯一有效的解决方案。

编辑 您可以在此处找到孔文件: http://pastebin.com/07adWVrr

【讨论】:

天哪,非常感谢你。经过几个小时试图弄清楚这一点,我正把脸撞在桌子上。您对此解决方案的评价不够。我不得不搜索你的 makeFragmentName 方法。对于任何未来的访客,我很确定是这个:***.com/a/9293207/1354164(至少对我有用)。请给自己买杯啤酒,假装是我送的! 我很高兴它可以帮助@GMBrian!我刚刚更新了答案,现在它不需要 makeFragmentName。此外,在 pastebin 上添加了孔文件的链接【参考方案2】:

您使用的是FragmentStatePagerAdapter。此适配器使用 ViewPager 中的片段。您在另一个父片段中有这个 ViewPager。所以你在片段中有片段。不支持嵌套片段。这就是您遇到问题的原因。见:Why it is not possible to use ViewPager within a Fragment? It actually is

最好的办法是使用普通的PagerAdapter 而不是 FragmentStatePagerAdapter。这使用常规视图而不是片段,应该可以正常工作。

【讨论】:

【参考方案3】:

如果需要多次滑动才能获得屏幕上的页面时出现问题,此代码解决了它:

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);

【讨论】:

以上是关于ViewPager 在返回时跳过视图留下空白的主要内容,如果未能解决你的问题,请参考以下文章

使用viewpager的片段事务返回空白视图

viewpager加fragment出现空白页面

IntelliJ IDEA 调试器在调试 Maven 测试时跳过断点

为啥 IntelliJ 在远程调试时跳过断点

UICollectionView 在滚动时留下空白单元格

java hibernate在插入时跳过插入'id'