7

我遇到了ViewPager的问题,我的ListView失去了它的滚动位置。滑动ViewPager时,Fragment不会调用onSaveInstanceState?

ListView控件的状态可以很容易地存储和使用恢复:

@Override 
public View onCreateView (LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
{ 
    View v = inflater.inflate(R.layout.frag_cool_things, container, false); 

    AdvListView listView = (AdvListView) v.findViewById(R.id.lv0); 
    listView.setOnItemClickListener(mOnListItemClicked); 

    if (null != savedInstanceState) 
    { 
     listView.onRestoreListViewInstanceState(savedInstanceState.getParcelable("list_state")); 
    } 

    mListView = listView; 

    return v; 
} 

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

    outState.putParcelable("list_state", mListView.onSaveListViewInstanceState()); 
} 

然而,问题是,当片段被偷走onDestroyView()被调用,但永远不会调用onSaveInstanceState (Bundle outState)

旋转屏幕等恢复ListView状态很好,但刷卡我无法弄清楚如何正确地恢复列表。

回答

15

更新11年12月17日:
我居然找到了正确的方法来保存片段的内容。您必须使用FragmentStatePagerAdapter。该适配器正确保存了片段的状态! :)

OLD:
好吧,我发现了一个办法做到这一点。如果你认为这是一个巨大的,不,不请分享您的输入! :P

这里是我FragmentBase类,修复了这个问题:

public abstract class FragmentBase extends Fragment 
{ 
    private boolean mInstanceAlreadySaved; 
    private Bundle mSavedOutState; 

    @Override 
    public View onCreateView (LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     if (null == savedInstanceState && null != mSavedOutState) { 
      savedInstanceState = mSavedOutState; 
     } 

     mInstanceAlreadySaved = false; 
     return onCreateViewSafe(inflater, container, savedInstanceState); 
    } 

    @Override 
    public void onSaveInstanceState (Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     mInstanceAlreadySaved = true; 
    } 

    @Override 
    public void onStop() 
    { 
     if (!mInstanceAlreadySaved) 
     { 
      mSavedOutState = new Bundle(); 
      onSaveInstanceState(mSavedOutState); 
     } 

     super.onStop(); 
    } 

    public abstract View onCreateViewSafe (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState); 
} 
+0

我自己的临时解决方案是只写我的东西在的onPause()的SharedPreferences,并在OnCreateView让他们回来(... )。但是,这会迫使您访问附加活动以获取Sharedpreferences(getActivity()。getSharedPreferences(...)),并且您可能还需要在活动被拆除时显式删除不需要的内容(具体取决于您的操作存储,ofc)。希望有人有更好的方法! :) –

+0

请参阅更新回答:) – Jona

+0

“当您滑过列表时,FragmentPagerAdapter会分离每个片段,但将它们保存在内存中,以便在用户向后滑动时可以简单地重新附加它们。如果碎片数量较多, FragmentStatePagerAdapter值得考虑,因为它将删除它们,缺点是当用户滑回到它们时需要重建。因此,如果FragmentPagerAdapter具有更少,更复杂的片段,但考虑使用FragmentStatePagerAdapter来处理更大的集合。 (Android开发人员博客) –

相关问题