7

我的 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很好地恢复状态,但是滑动我无法弄清楚如何正确恢复列表。

4

1 回答 1

16

2011 年 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);
}
于 2011-12-07T22:51:23.287 回答