Android 当我将ViewPager中的RecyclerView放在后台很长一段时间后返回时,它是空的

Android 当我将ViewPager中的RecyclerView放在后台很长一段时间后返回时,它是空的,android,android-fragments,android-recyclerview,android-viewpager,Android,Android Fragments,Android Recyclerview,Android Viewpager,我把一个RecyclerView放在一个ViewPager里。当我打开应用程序时,它工作正常。当我转动屏幕时,它工作正常。如果我最小化应用程序,几分钟后我返回到它,一切正常。然而,当我把它放在后台很长一段时间后回来时,所有已经加载的页面,三个,都是空的。我可以与ViewPager正常交互,如果我滚动到一边,我会进入显示内容的RecyclerView。如果我走得够远,导致加载的列表在我回来时被销毁,它们是正常的。问题是当应用程序返回时,页面上没有已经加载的内容。谁能告诉我为什么会发生这种情况,我该

我把一个RecyclerView放在一个ViewPager里。当我打开应用程序时,它工作正常。当我转动屏幕时,它工作正常。如果我最小化应用程序,几分钟后我返回到它,一切正常。然而,当我把它放在后台很长一段时间后回来时,所有已经加载的页面,三个,都是空的。我可以与ViewPager正常交互,如果我滚动到一边,我会进入显示内容的RecyclerView。如果我走得够远,导致加载的列表在我回来时被销毁,它们是正常的。问题是当应用程序返回时,页面上没有已经加载的内容。谁能告诉我为什么会发生这种情况,我该如何解决

下面是一些代码:

主要活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    db = new VirtualDataBase(this);

    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    tabLayout.setupWithViewPager(mViewPager);
    mViewPager.setCurrentItem(selectedTab);
}
然后是片段:

    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setRetainInstance(true);
        fragment.setArguments(args);
        fragment.setSectionId(sectionNumber);
        return fragment;
    }

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_main, container, false);

        if(savedInstanceState != null){
            rootView.invalidate();
        }

        mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view);
        mRecyclerView.setHasFixedSize(true);
        meusItems= new MeusItems();

        myDataset = new ArrayList<>();

        db = new VirtualDataBase(getContext());
        list1 = db.getList1();

        if (sectionId == 1) {
            mAdapter = new MainList1Adapter(list1, this);
            mRecyclerView.setAdapter(mAdapter);
        } else if (sectionId == 2) {
            myDataset = meusItems.getFirstPart();
            mAdapter = new MainAdapter(myDataset, this);
            mRecyclerView.setAdapter(mAdapter);
        } else if (sectionId == 3) {
            myDataset = meusItems.getSecondPart();
            mAdapter = new MainAdapter(myDataset, this);
            mRecyclerView.setAdapter(mAdapter);
        }

        mRecyclerView.addItemDecoration(
                new DividerItemDecoration(rootView.getContext(), DividerItemDecoration.VERTICAL));
        mLayoutManager = new LinearLayoutManager(rootView.getContext());
        mRecyclerView.setLayoutManager(mLayoutManager);

        return rootView;
    }

这些都是我用来创建屏幕的相关方法。

发生的事情是,android正在破坏您片段的视图,当您回来时,android正在重新创建这些视图,而不会破坏片段本身


可能(没有代码很难猜测),您正在
onCreate
中创建片段视图,而不是
onCreateView

,过了一会儿我发现了问题。在应用程序中,有一个片段根据其位置呈现不同的数据。我正在使用
sectionId
设置每个ViewPager页面上显示的内容:

if (sectionId == 1) {
    mAdapter = new MainList1Adapter(list1, this);
    mRecyclerView.setAdapter(mAdapter);
} else if (sectionId == 2) {
    myDataset = meusItems.getFirstPart();
    mAdapter = new MainAdapter(myDataset, this);
    mRecyclerView.setAdapter(mAdapter);
} else if (sectionId == 3) {
    myDataset = meusItems.getSecondPart();
    mAdapter = new MainAdapter(myDataset, this);
    mRecyclerView.setAdapter(mAdapter);
}
发生的情况是,当应用程序在后台停留太长时间,然后重新打开时,
sectionId
等于0
。为了解决这个问题,我使用
onSaveInstanceState
保存了
sectionId
的值:

 @Override
 public void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
     outState.putInt("sectionId", sectionId);
 }
并在创建视图中检索该值:

if(savedInstanceState != null){
    sectionId = savedInstanceState.getInt("sectionId");
}

考虑改用FragmentStatePagerAdapter。如果有大量的子片段,这是一个更好的选择。其次,您可能在片段中加载了太多视图

替换:-

public class YourAdapterName extends FragmentPagerAdapter
为此:-

public class YourAdapterName extends FragmentStatePagerAdapter

您对您的问题给出了极好的描述,但实现ViewPager的方法不止一种。所以我(几乎)不知道是什么导致了这种行为。请考虑发布足够的代码,这样我们就可以重现错误。抱歉@ 0x0NuuGar,我刚刚更新了问题并添加了一些代码。这就足够了吗?好得多:)我的第一个想法是:你很可能在使用一个保留的片段,因为我在我的一个应用程序中经历过类似的行为。因此,很高兴看到情况如此。现在我不想写一个像“好吧,当你使用保留片段时会发生这种情况”这样的答案,并且没有任何解决问题的建议。我想根据您的代码设置一个示例,并向您提供一个经过测试的解决方案,但这需要一段时间。向您的查看寻呼机添加屏幕外页面限制应该可以使您在任何时候都拥有如此多的片段。这可能是必需的。@AlokOmkar我已经尝试在我的查看寻呼机上使用屏幕外页面限制来解决此问题,但它没有起作用,无论如何,谢谢。
public class YourAdapterName extends FragmentStatePagerAdapter