Skip to content
This repository was archived by the owner on Oct 23, 2021. It is now read-only.

Commit 4a21f5a

Browse files
committed
Fixed Parceable Selection States
issue working for both retained fragments and non retained fragment
1 parent ae7ae37 commit 4a21f5a

File tree

3 files changed

+90
-11
lines changed

3 files changed

+90
-11
lines changed

criminalintent-sample/src/main/java/com/bignerdranch/android/criminalintent/CrimeListFragment.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public void onCreate(Bundle savedInstanceState) {
4242
super.onCreate(savedInstanceState);
4343
setHasOptionsMenu(true);
4444
getActivity().setTitle(R.string.crimes_title);
45-
setRetainInstance(true);
45+
//setRetainInstance(true);
4646
mSubtitleVisible = false;
4747
}
4848

@@ -55,17 +55,31 @@ public void onCreate(Bundle savedInstanceState) {
5555
*/
5656
@Override
5757
public void onActivityCreated(Bundle savedInstanceState) {
58-
super.onActivityCreated(savedInstanceState);
58+
59+
if( mMultiSelector==null)return;
60+
61+
Bundle bundle=savedInstanceState;
62+
if(bundle!=null) mMultiSelector=bundle.getParcelable(MultiSelector.TAG);
63+
5964
if(mMultiSelector.isSelectable()){
60-
if(mDeleteMode !=null){
61-
mDeleteMode.setClearOnPrepare(false);
62-
beginActionMode();
65+
if(mDeleteMode !=null){
66+
mDeleteMode.setClearOnPrepare(false);
67+
beginActionMode();
68+
69+
}
6370

6471
}
6572

66-
}
73+
super.onActivityCreated(savedInstanceState);
6774
}
6875

76+
@Override
77+
public void onSaveInstanceState(Bundle outState) {
78+
outState.putParcelable(MultiSelector.TAG,mMultiSelector);
79+
super.onSaveInstanceState(outState);
80+
}
81+
82+
6983
@TargetApi(11)
7084
@Override
7185
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
@@ -211,6 +225,8 @@ public CrimeHolder(View itemView) {
211225
mDateTextView = (TextView) itemView.findViewById(R.id.crime_list_item_dateTextView);
212226
mSolvedCheckBox = (CheckBox) itemView.findViewById(R.id.crime_list_item_solvedCheckBox);
213227
itemView.setOnClickListener(this);
228+
itemView.setClickable(true);
229+
itemView.setOnLongClickListener(this);
214230

215231
}
216232

recyclerview-multiselect/src/main/java/com/bignerdranch/android/multiselector/MultiSelector.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.bignerdranch.android.multiselector;
22

3+
import android.os.Parcel;
4+
import android.os.Parcelable;
35
import android.util.SparseBooleanArray;
46

57
import java.util.ArrayList;
@@ -32,10 +34,11 @@
3234
* }
3335
* </pre>
3436
*/
35-
public class MultiSelector {
37+
public class MultiSelector implements Parcelable {
3638
private SparseBooleanArray mSelections = new SparseBooleanArray();
3739
private WeakHolderTracker mTracker = new WeakHolderTracker();
3840
private boolean mIsSelectable;
41+
public static final String TAG="multiselector";
3942
/**
4043
* <p>Toggle whether this MultiSelector is in selection mode or not.
4144
* {@link com.bignerdranch.android.multiselector.SelectableHolder#setSelectable(boolean)}
@@ -196,4 +199,34 @@ private void refreshHolder(SelectableHolder holder) {
196199
}
197200

198201

202+
@Override
203+
public int describeContents() {
204+
return 0;
205+
}
206+
207+
@Override
208+
public void writeToParcel(Parcel dest, int flags) {
209+
dest.writeSparseBooleanArray(this.mSelections);
210+
dest.writeParcelable(this.mTracker,flags);
211+
dest.writeByte(mIsSelectable ? (byte) 1 : (byte) 0);//write the boolean in form of logical 0 or 1
212+
}
213+
214+
public MultiSelector() {
215+
}
216+
217+
private MultiSelector(Parcel in) {
218+
this.mSelections = in.readSparseBooleanArray();
219+
this.mTracker = in.readParcelable(WeakHolderTracker.class.getClassLoader());
220+
this.mIsSelectable = in.readByte() != 0;//retrieve the boolean information
221+
}
222+
223+
public static final Parcelable.Creator<MultiSelector> CREATOR = new Parcelable.Creator<MultiSelector>() {
224+
public MultiSelector createFromParcel(Parcel source) {
225+
return new MultiSelector(source);
226+
}
227+
228+
public MultiSelector[] newArray(int size) {
229+
return new MultiSelector[size];
230+
}
231+
};
199232
}

recyclerview-multiselect/src/main/java/com/bignerdranch/android/multiselector/WeakHolderTracker.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package com.bignerdranch.android.multiselector;
22

3+
import android.os.Parcel;
4+
import android.os.Parcelable;
35
import android.util.SparseArray;
46

57
import java.lang.ref.WeakReference;
68
import java.util.ArrayList;
79
import java.util.List;
810

9-
class WeakHolderTracker {
10-
private SparseArray<WeakReference<SelectableHolder>> mHoldersByPosition =
11-
new SparseArray<WeakReference<SelectableHolder>>();
11+
class WeakHolderTracker implements Parcelable {
12+
private SparseArray<WeakReferenceSelectableHolder<SelectableHolder>> mHoldersByPosition =
13+
new SparseArray<>();
1214

1315
/**
1416
* Returns the holder with a given position. If non-null, the returned
@@ -32,7 +34,7 @@ public SelectableHolder getHolder(int position) {
3234
}
3335

3436
public void bindHolder(SelectableHolder holder, int position) {
35-
mHoldersByPosition.put(position, new WeakReference<SelectableHolder>(holder));
37+
mHoldersByPosition.put(position, new WeakReferenceSelectableHolder<SelectableHolder>(holder));
3638
}
3739

3840
public List<SelectableHolder> getTrackedHolders() {
@@ -49,4 +51,32 @@ public List<SelectableHolder> getTrackedHolders() {
4951

5052
return holders;
5153
}
54+
55+
@Override
56+
public int describeContents() {
57+
return 0;
58+
}
59+
60+
@Override
61+
public void writeToParcel(Parcel dest, int flags) {
62+
dest.writeSparseArray((SparseArray)this.mHoldersByPosition);
63+
}
64+
65+
public WeakHolderTracker() {
66+
}
67+
68+
private WeakHolderTracker(Parcel in) {
69+
70+
this.mHoldersByPosition = in.readSparseArray(SparseArray.class.getClassLoader());
71+
}
72+
73+
public static final Parcelable.Creator<WeakHolderTracker> CREATOR = new Parcelable.Creator<WeakHolderTracker>() {
74+
public WeakHolderTracker createFromParcel(Parcel source) {
75+
return new WeakHolderTracker(source);
76+
}
77+
78+
public WeakHolderTracker[] newArray(int size) {
79+
return new WeakHolderTracker[size];
80+
}
81+
};
5282
}

0 commit comments

Comments
 (0)