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

4
我正在制作一个有4个主要视图的应用程序。我希望它们都停留在顶部的列表菜单上(目前是这样的)。
使用Fragments,我有能力改变视图而不需要实际到达另一个活动页面,但由于我的视图之一有ViewPager,在这么做时它完全不起作用(当我首次加载视图时,内容是好的,但第二次时,ViewPager上的视图消失了,并且只会在我向左滑动2个位置后再重新出现)(见图片,显示了第一次加载时间和第二次)。
请注意,ViewPager并不是为了显示菜单项而存在的,事实上它是当前菜单项的Fragment的一部分(在这种情况下,“Simula'c〜ao”)。
我的问题是:这是一个已知的问题吗?是否有简单的方法来解决它,或者我必须以另一种方式来做?我已经在互联网上搜寻过这个问题,但是对我都没什么作用(无效,设置ongetItemPosition以返回POSITION_NONE等等)。
我已经查看了ViewPager类,一切似乎都很正常,我已经修改了它,以便每次我呈现视图时,它都会强制渲染所有内容,但是这样也没有用。
我已经尝试设置GONE和VISIBLE的可见性。
我已经尝试分离和附加适配器。
尝试缓存视图并返回缓存版本。
有一件事似乎起作用:更改手机的方向。那样是有效的。
试过很多事情,我甚至都记不住了……我对此有点生气,因为过去的24小时完全没有帮助我解决这个“谜题”。我希望你们中的一些人可以帮忙。
我的代码: https://www.dropbox.com/s/u4mlxr3k6ta9yrm/MainActivity.java https://www.dropbox.com/s/2dqfnzjs2wl89hj/SimulationFragment.java

Views: 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

3个回答

5
好的,经过长时间的努力去探究这个问题, @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


1
我的天啊,非常感谢你。经过几个小时的尝试,我一直在桌子上愁眉苦脸地摆弄这个问题。你对这个解决方案没有得到足够的赞誉。我不得不搜索你的makeFragmentName方法。 对于任何未来的访问者,我相信它就是这个:https://dev59.com/vGoy5IYBdhLWcg3wFqFT#9293207(至少对我有效)。请给自己买一杯啤酒,并假装是我送的! - GMBrian
我很高兴能帮助@GMBrian!我刚刚更新了答案,现在不需要makeFragmentName了。此外,我还添加了一个pastebin上整个文件的链接。 - Ivan Seidel

0
如果需要多次滑动才能将页面显示在屏幕上,可以使用以下代码解决此问题:
mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);

0

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