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

时间:2011-10-12 21:11:59

标签: 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);
    }
}

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);
    }
}

13 个答案:

答案 0 :(得分:214)

我有同样的问题。将我的PageAdapter的父类从android.support.v4.app.FragmentPagerAdapter更改为android.support.v4.app.FragmentStatePagerAdapter可以在“第二次”解决我的ViewPager显示问题!

答案 1 :(得分:81)

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

hackbod的链接是关键(https://developer.android.com/about/versions/android-4.2.html#NestedFragments),可在此帖Fragments within Fragments找到

  

要嵌套片段,只需在上面调用getChildFragmentManager()即可   要添加片段的片段。这会返回一个   像你通常那样使用的FragmentManager   用于创建片段事务的顶级活动。

答案 2 :(得分:15)

对我来说,我不得不在我的viewpager上打电话:

myViewPager.setSaveFromParentEnabled(false);

我遇到的问题是,viewpager并不令人耳目一新,我所看到的只是一个空白的白色屏幕。我在getChildFragmentManager中传递但它没有帮助。

答案 3 :(得分:9)

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

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

答案 4 :(得分:2)

这会为您提供帮助。

    viewPager.setOffscreenPageLimit(position);

答案 5 :(得分:1)

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

答案 6 :(得分:0)

您还可以在应用程序最小化并稍后调用时遇到此错误的情况下初始化适配器。

@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);
    initViewPagerAdapter();
    return mView;
}
private void initViewPagerAdapter(){
    mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
    new setAdapterTask().execute();
}

@Override
public void onResume(){
    super.onResume();
    initViewPagerAdapter();
}

答案 7 :(得分:0)

我有同样的事情,在第二次调用Pager Adapter时,子视图返回一个NullPointerException。 并且更改FragmentStatePagerAdapter中的适应器也解决了我的问题。

答案 8 :(得分:0)

我在 Xamarin Android上遇到了同样的问题,第二次出现空白屏幕。设置以下内容为我修好了。

viewPager.SaveFromParentEnabled = false;

答案 9 :(得分:0)

尝试将setOffscreenPageLimit (int limit)放在父ViewPager上。

mViewPager.setOffscreenPageLimit(totalPages-1);

这对我来说就像魅力一样。

在我的情况下,我在TabLayoutViewPager.内部有片段

该片段中的另一个ViewPager。第一次一切正常,但是当我更改Tab键并返回时,我的某些片段变成空白。

答案 10 :(得分:0)

FragmentPagerAdapter更改为FragmentStatePagerAdapter 使用getChildFragmentManager()代替getFragmentManager()

getChildFragmentManager()-因为根据文档,它将返回一个私有的FragmentManager,用于在此Fragment中放置和管理Fragment。同时getFragmentManager()将返回用于与与此活动相关联的片段进行交互的FragmentManager

答案 11 :(得分:0)

ViewPagerAdapter类扩展了FragmentStatePagerAdapter,对我来说这项工作可以尝试

答案 12 :(得分:0)

只需在适配器中调用curl --user myrpcusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getnewaddress", "params": [] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/ 。那么您将不会多次单击空白