我在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;
}