From fbfc98b98dbe4b3311cd62b77beec4f58f4fb4a3 Mon Sep 17 00:00:00 2001 From: seven332 Date: Sun, 5 Apr 2015 14:37:45 +0800 Subject: [PATCH] EasyRecyclerView SavedState --- .../widget/recyclerview/EasyRecyclerView.java | 110 ++++++++++++++---- 1 file changed, 89 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/hippo/widget/recyclerview/EasyRecyclerView.java b/app/src/main/java/com/hippo/widget/recyclerview/EasyRecyclerView.java index b29f4d0f1..766fd65f8 100644 --- a/app/src/main/java/com/hippo/widget/recyclerview/EasyRecyclerView.java +++ b/app/src/main/java/com/hippo/widget/recyclerview/EasyRecyclerView.java @@ -17,6 +17,9 @@ package com.hippo.widget.recyclerview; import android.content.Context; import android.os.Build; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.annotation.NonNull; import android.support.v4.util.LongSparseArray; import android.support.v7.app.ActionBarActivity; import android.support.v7.view.ActionMode; @@ -45,11 +48,6 @@ import com.hippo.util.ViewUtils; // Get some code from twoway-view and AbsListView. public class EasyRecyclerView extends RecyclerView { - private static final String STATE_KEY_CHOICE_MODE = "choiceMode"; - private static final String STATE_KEY_CHECKED_STATES = "checkedStates"; - private static final String STATE_KEY_CHECKED_ID_STATES = "checkedIdStates"; - private static final String STATE_KEY_CHECKED_COUNT = "checkedCount"; - /** * Represents an invalid position. All valid positions are in the range 0 to 1 less than the * number of items in the current adapter. @@ -759,27 +757,97 @@ public class EasyRecyclerView extends RecyclerView { setViewChecked(view, isItemChecked(position)); } - /* - @Override - public Parcelable onSaveInstanceState() { - final Parcelable state = new Bundle(super.onSaveInstanceState()); + static class SavedState extends BaseSavedState { + int choiceMode; + int checkedItemCount; + SparseBooleanArray checkState; + LongSparseArray checkIdState; - state.putInt(STATE_KEY_CHOICE_MODE, mChoiceMode); - state.putParcelable(STATE_KEY_CHECKED_STATES, mCheckStates); - state.putParcelable(STATE_KEY_CHECKED_ID_STATES, mCheckedIdStates); - state.putInt(STATE_KEY_CHECKED_COUNT, mCheckedItemCount); + /** + * Constructor called from {@link #onSaveInstanceState()} + */ + SavedState(Parcelable superState) { + super(superState); + } - return state; + /** + * Constructor called from {@link #CREATOR} + */ + private SavedState(Parcel in) { + super(in); + choiceMode = in.readInt(); + checkedItemCount = in.readInt(); + checkState = in.readSparseBooleanArray(); + final int N = in.readInt(); + if (N > 0) { + checkIdState = new LongSparseArray<>(); + for (int i=0; i CREATOR + = new Parcelable.Creator() { + @Override + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; } - public void onRestoreInstanceState(Bundle state) { - mChoiceMode = ChoiceMode.values()[state.getInt(STATE_KEY_CHOICE_MODE)]; - mCheckedStates = state.getParcelable(STATE_KEY_CHECKED_STATES); - mCheckedIdStates = state.getParcelable(STATE_KEY_CHECKED_ID_STATES); - mCheckedCount = state.getInt(STATE_KEY_CHECKED_COUNT); + @Override + public Parcelable onSaveInstanceState() { + final SavedState ss = new SavedState(super.onSaveInstanceState()); - // TODO confirm ids here - }*/ + ss.choiceMode = mChoiceMode; + ss.checkedItemCount = mCheckedItemCount; + ss.checkState = mCheckStates; + ss.checkIdState = mCheckedIdStates; + + return ss; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + SavedState ss = (SavedState) state; + super.onRestoreInstanceState(ss.getSuperState()); + + setChoiceMode(ss.choiceMode); + mCheckedItemCount = ss.checkedItemCount; + if (ss.checkState != null) { + mCheckStates = ss.checkState; + } + if (ss.checkIdState != null) { + mCheckedIdStates = ss.checkIdState; + } + + if (mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL) { + mChoiceActionMode = mActionBarActivity.startSupportActionMode(mMultiChoiceModeCallback); + } + updateOnScreenCheckedViews(); + } private final class CheckForTap implements Runnable { float x;