滑动ViewPager时片段不会调用onSaveInstanceState?

时间:2011-12-07 21:55:50

标签: android android-widget android-viewpager android-lifecycle

我遇到ViewPager的问题,我的ListView失去了它的滚动位置。

可以使用以下方法轻松存储和恢复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状态就好了,但是滑动我无法弄清楚如何正确恢复列表。

1 个答案:

答案 0 :(得分:15)

更新12/17/11:
我实际上找到了保存片段内容的正确方法。您必须使用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);
}