7

ListViewのスクロール位置が失われるViewPagerに問題があります。

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 に答える