ViewPager中使用FragmentPagerAdapter的片段在第二次查看时为空白

how*_*ttl 96 android android-fragments android-viewpager android-nested-fragment

我有一个片段界面,底部有标签,可以在主视图中打开不同的片段.

我有一个特定的片段,它是一个项目列表.如果用户选择此列表中的一个项目,则打开另一个片段,其中包含一个viewpager,它在前一个片段的列表中的所有项目之间水平滚动.这非常有效.

viewpager使用FragmentPagerAdapter来显示项目.

当用户选择列表中的项目,查看它,然后点击标签栏上的按钮返回列表,然后选择另一个项目时,问题就出现了.第二次选择项目时,将显示空白屏幕而不是viewpager.发生这种情况时,我的LogCat中没有收到任何错误.

为什么viewpager只出现在第一次?

FragmentPagerAdapter:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    Cursor mCursor;

    public ViewPagerAdapter(FragmentManager fm, Cursor c) {
        super(fm);
        mCursor = c;
    }

    public void changeCursor(Cursor c) {
        mCursor = c;
        this.notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        if (mCursor == null) return 0;
        else return mCursor.getCount();
    }

    @Override
    public Fragment getItem(int position) {
        mCursor.moveToPosition(position);
        return TeamCardFragment.newInstance(mCursor, position);
    }
}
Run Code Online (Sandbox Code Playgroud)

PagerFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Bundle bundle = getArguments();
    mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);

    View mView = inflater.inflate(R.layout.team_card_master, container, false);
    mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);

    mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
    new setAdapterTask().execute();

    return mView;
}

private class setAdapterTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        mViewPager.setAdapter(mAdapter);
        mViewPager.setCurrentItem(mCursorPosition);
    }
}
Run Code Online (Sandbox Code Playgroud)

Yan*_*ann 215

我遇到过同样的问题.更改我的PageAdapter的父类android.support.v4.app.FragmentPagerAdapterandroid.support.v4.app.FragmentStatePagerAdapter解决ViewPager"第二次"的显示问题!

  • 多好的人啊!我好几天都在寻找这个解决方案!多谢一个男人,就像一个魅力.但我的开发人员询问这种变化会产生什么影响?我的意思是为什么它在StatePagerAdapter中之前和之前没有用 (10认同)
  • Btw在这里找到了一个很好的解释:http://stackoverflow.com/q/18747975/1257369 (4认同)
  • 开玩笑吧?我不再有这个代码,否则我会测试它.也许这个答案会帮助别人. (2认同)
  • 这实际上对我不起作用:( (2认同)

Dan*_*l F 85

我设法通过更换来解决这个getFragmentManager()getChildFragmentManager()父片段.此父片段正在实例化android.support.v4.app.FragmentPagerAdapter以包含可分页(可滑动)片段,这需要构造函数中的片段管理器.对于这个构造函数,我传递了返回值getChildFragmentManager().

hackbod的链接很关键(https://developer.android.com/about/versions/android-4.2.html#NestedFragments),这篇文章在片段中发现片段

要嵌套片段,只需调用getChildFragmentManager()要添加片段的片段即可.这将返回一个FragmentManager,您可以像通常从顶级活动那样使用它来创建片段事务.


j2e*_*nue 15

对我来说,我不得不在我的viewpager上调用它:

myViewPager.setSaveFromParentEnabled(false);
Run Code Online (Sandbox Code Playgroud)

我有一个问题,其中viewpager没有刷新,我所看到的只是一个空白的白色屏幕碎片应该是.我在getChildFragmentManager中传递但它没有帮助.

  • 过去 2 天我遇到了同样的问题。您的解决方案对我有用。谢谢 ! (2认同)

小智 10

在我的特殊情况下,我在使用带有AppBarLayout和ViewPager的CoordinatorLayout时,为我解决的是从我的AppBarLayout xml属性中删除android:fitsSystemWindows ="true".

不要问我为什么.我知道这听起来有点荒谬,并且它应该没有相关性,但是这一行是唯一导致麻烦的因为我已经在我的适配器中使用了getChildFragmentManager().我花了整整一天调试我的代码才发现这个,所以我希望它能节省一些时间.

  • 噢,天哪……我几乎要投降了。你让我抓狂!Google Geez,WTF的AppBarLayout错误吗?我看了将近一百页,花了很多小时进行调试,试图解决这个问题而没有运气。我终于通过您的评论解决了这个问题,我真的很感激。非常感谢!PS:我非常绝望,甚至在AOSP中创建了一个问题:https://code.google.com/p/android/issues/detail?id=230905&amp;can=4&amp;sort=-opened&amp;colspec=ID%20Status%20Priority%20Owner %20Summary%20Stars%20Reporter%20Opened XD (3认同)

Yas*_*N P 9

我有同样的问题,我将适配器更改FragmentPagerAdapterFragmentStatePagerAdaptergetFragmentManager()父片段中的getChildFragmentManager()

这背后的原因FragmentStatePagerAdapter是有助于存储大量页面,并且与访问的每个页面相关联的存储器较少,因为它在页面不可见时仅保留片段的保存状态.这减少了在片段之间切换时的开销.


how*_*ttl 1

我们通过将视图分页器项目重新实现为标准视图而不是片段并相应地更改适配器来解决这个问题。