Фрагмент не вызывает onSaveInstanceState при перелистывании ViewPager? - PullRequest
7 голосов
/ 08 декабря 2011

У меня проблема с 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 Ответ

15 голосов
/ 08 декабря 2011

Обновление 17.12.11:
Я действительно нашел правильный способ сохранить содержимое фрагментов.Вы должны использовать FragmentStatePagerAdapter.Этот адаптер правильно сохраняет состояние фрагмента!:)

СТАРЫЙ:
Ну, я нашел способ сделать это .. Пожалуйста, поделитесь своим мнением, если вы считаете, что это огромный нет нет!: 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);
}
...