Android FragmentStatePagerAdapter для пользовательского просмотра - PullRequest
0 голосов
/ 23 февраля 2019

, поскольку мне не нравится реализация по умолчанию нижней панели навигации Android, я создал ее и соединил с помощью FragmentStatePagerAdapter.Я просто хочу знать, как я могу получить уже созданные фрагменты с их сохраненным состоянием экземпляра из моего адаптера, как это делает viewpager?Было бы хорошо, если бы кто-нибудь мог помочь мне решить это.

1 Ответ

0 голосов
/ 27 февраля 2019

Я решил это самостоятельно.Я совершенно забыл заботиться о сохраненном состоянии экземпляра, на мой взгляд.Я получил его из исходного кода ViewPager и немного изменил, потому что некоторые методы были помечены как устаревшие.Здесь реализация.

@Nullable
@Override
protected Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();
    SaveState ss = new SaveState(superState);
    ss.position = lastSelectedPosition;
    ss.itemId = lastSelectedItemId;
    if (mAdapter != null) {
        ss.adapterState = mAdapter.saveState();
    }
    return ss;
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
    if (!(state instanceof SaveState)) {
        super.onRestoreInstanceState(state);
        return;
    }
    SaveState ss = (SaveState) state;
    super.onRestoreInstanceState(ss.getSuperState());
    if (mAdapter != null) {
        mAdapter.restoreState(ss.adapterState, ss.loader);
        setSelectedItem(ss.position, ss.itemId);
        lastSelectedItemId = ss.itemId;
        lastSelectedPosition = ss.position;
    }
}

public static class SaveState extends BaseSavedState {
    int position;
    int itemId;
    Parcelable adapterState;
    ClassLoader loader;

    SaveState(Parcelable superState) {
        super(superState);
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        super.writeToParcel(out, flags);
        out.writeInt(position);
        out.writeInt(itemId);
        out.writeParcelable(adapterState, flags);
    }

    public static final Parcelable.ClassLoaderCreator<SaveState> CREATOR = new 
    Class later dater<SaveState>() {
        @Override
        public SaveState createFromParcel(Parcel source) {
            return new SaveState(source, null);
        }

        @Override
        public SaveState[] newArray(int size) {
            return new SaveState[size];
        }

        @Override
        public SaveState createFromParcel(Parcel source, ClassLoader loader) {
            return new SaveState(source, loader);
        }
    };

    SaveState(Parcel in, ClassLoader loader) {
        super(in);
        if (loader == null) {
            loader = getClass().getClassLoader();
        }
        position = in.readInt();
        itemId = in.readInt();
        adapterState = in.readParcelable(loader);
        this.loader = loader;
    }

}
...