我在ViewPager中有一个片段。片段包含一个RecyclerView(认为是ListView)。当用户分页离开并返回到片段时,无论用户离开列表的位置如何,列表始终从顶部重新开始。所以我需要以某种方式保留currPosition。 saveInstanceState将是存储它的好地方吗?如果是,我在哪个回调中读取数据?再次,这是在ViewPager内部,并且我正在使用FragmentPagerAdapter,因此没有调用很多回调。我的更广泛的问题仍然存在:是什么导致Fragment的savedInstanceState为非空?

为了进一步扩大这个问题。想象一下,我有一个包含两个片段的活动。我会在需要时分离并附加碎片。假设我离开了该活动。如果活动的saveInstanceState不为空,则在这种情况下,片段的saveInstanceState是否为空?确切地说,这是第二种情况的一些代码

private void addMainFragment() {

  FragmentManager fm=getSupportFragmentManager();

      FragmentTransaction transaction = fm.beginTransaction();

      Fragment removeFragment = fm.findFragmentByTag(getString(R.string.fragment_a));

      if(null != removeFragment){

    transaction.detach(removeFragment);

      }

  Fragment fragment = fm.findFragmentByTag(getString(R.string.fragment_b));

      if(null != fragment){

        transaction.attach(fragment);

      }else{

    fragment=MainFragment.newInstance(null,null);


交易。
      添加(R.id.fragment_container,fragment,getString(R.string.fragment_b));
    }
      transaction.commit(); }

最佳答案

savedInstanceState是保存诸如当前位置,所选项目等信息的最佳位置。

查看分页器具有屏幕外页面限制,该限制可处理在当前可见页面的任一侧保持多少页面(在这种情况下为片段)处于空闲状态。如果页面超出此限制,则页面将被销毁。这是为了保持较低的内存使用率。此设置默认为1。因此,当片段超出该限制并返回时,其saveInstanceState将为非null。

回答第二个问题。我不太确定离开活动后的意思。如果您离开活动(例如,按“后退” /“主页”按钮),请返回。活动saveInstanceState将为null。
如果您在当前活动之上启动另一个活动,则将调用onSavedInstance。

这是我在一个项目中使用的代码片段,用于还原Viewpager中的片段状态。

您可以覆盖onSaveInstanceState以保存有关该片段的一些信息。

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // restore state
    mListState = mLayoutManager.onSaveInstanceState();
    state.putParcelable("list_state", mListState);
}


然后在片段onCreateView中,您可以恢复recycelerview的状态

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

    ...

    if (savedInstanceState != null) {
        // save list state
        mListState = state.getParcelable("list_state");
        mLayoutManager.onRestoreInstanceState(mListState);
    }

    return root;
}

10-07 18:29