Skip to content

Commit 7951ae3

Browse files
committed
trying to get rid of parcelable
1 parent 1ecd00f commit 7951ae3

File tree

5 files changed

+57
-15
lines changed

5 files changed

+57
-15
lines changed

example/src/main/java/com/github/vivchar/example/pages/github/GithubFragment.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ public class GithubFragment extends BaseScreenFragment {
5959
private GridLayoutManager mLayoutManager;
6060
private SwipeRefreshLayout mSwipeToRefresh;
6161
private GithubPresenter mGithubPresenter;
62+
@Nullable
63+
private Bundle mSavedInstanceState;
6264

6365
@Nullable
6466
@Override
@@ -123,7 +125,14 @@ public void onLoadMore(final int page, final int totalItemsCount) {
123125
@Override
124126
public void onViewStateRestored(@Nullable final Bundle savedInstanceState) {
125127
super.onViewStateRestored(savedInstanceState);
126-
mRecyclerViewAdapter.onRestoreInstanceState(savedInstanceState);
128+
mSavedInstanceState = savedInstanceState;
129+
}
130+
131+
@Override
132+
public void onResume() {
133+
super.onResume();
134+
mRecyclerViewAdapter.onRestoreInstanceState(mSavedInstanceState);
135+
mSavedInstanceState = null;
127136
}
128137

129138
@Override

example/src/main/java/com/github/vivchar/example/pages/github/items/list/RecyclerViewState.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,21 @@
77
import com.github.vivchar.rendererrecyclerviewadapter.CompositeViewState;
88
import com.github.vivchar.rendererrecyclerviewadapter.ViewState;
99

10+
import java.io.Serializable;
1011
import java.util.HashMap;
1112

1213
/**
1314
* Created by Vivchar Vitaly on 21.10.17.
1415
*/
1516

16-
public class RecyclerViewState extends CompositeViewState<RecyclerViewHolder> {
17-
18-
@NonNull
19-
private final HashMap<Integer, ViewState> mViewStates;
17+
public class RecyclerViewState extends CompositeViewState<RecyclerViewHolder> implements Serializable {
2018

2119
public RecyclerViewState(@NonNull final CompositeViewHolder holder) {
2220
super(holder);
23-
mViewStates = holder.getAdapter().getStates();
2421
}
2522

2623
@Override
2724
public void restore(@NonNull final RecyclerViewHolder holder) {
2825
super.restore(holder);
29-
holder.getAdapter().setStates(mViewStates);
3026
}
3127
}

example/src/main/java/com/github/vivchar/example/pages/github/items/stargazer/StargazerViewState.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44

55
import com.github.vivchar.rendererrecyclerviewadapter.ViewState;
66

7+
import java.io.Serializable;
8+
79
/**
810
* Created by Vivchar Vitaly on 21.10.17.
911
*/
1012

11-
public class StargazerViewState implements ViewState<StargazerViewHolder> {
13+
public class StargazerViewState implements ViewState<StargazerViewHolder>, Serializable {
1214

1315
private static final String TAG = StargazerViewState.class.getSimpleName();
1416
private final int mVisibility;

example/src/main/java/com/github/vivchar/example/pages/simple/ViewStateFragment.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public class ViewStateFragment extends BaseScreenFragment {
3333

3434
private final YourDataProvider mYourDataProvider = new YourDataProvider();
3535
private RendererRecyclerViewAdapter mRecyclerViewAdapter;
36+
@Nullable
37+
private Bundle mSavedInstanceState;
3638

3739
@Nullable
3840
@Override
@@ -77,7 +79,14 @@ public int createViewStateID(@NonNull final StateViewModel model) {
7779
@Override
7880
public void onViewStateRestored(@Nullable final Bundle savedInstanceState) {
7981
super.onViewStateRestored(savedInstanceState);
80-
mRecyclerViewAdapter.onRestoreInstanceState(savedInstanceState);
82+
mSavedInstanceState = savedInstanceState;
83+
}
84+
85+
@Override
86+
public void onResume() {
87+
super.onResume();
88+
mRecyclerViewAdapter.onRestoreInstanceState(mSavedInstanceState);
89+
mSavedInstanceState = null;
8190
}
8291

8392
@Override
Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,49 @@
11
package com.github.vivchar.rendererrecyclerviewadapter;
22

3-
import android.os.Parcelable;
43
import android.support.annotation.NonNull;
4+
import android.support.v7.widget.LinearLayoutManager;
5+
import android.support.v7.widget.RecyclerView;
6+
import android.util.Log;
7+
import android.view.View;
8+
9+
import java.io.Serializable;
10+
import java.util.HashMap;
511

612
/**
713
* Created by Vivchar Vitaly on 20.10.17.
8-
*
914
*/
10-
public class CompositeViewState <VH extends CompositeViewHolder> implements ViewState<VH> {
15+
public class CompositeViewState <VH extends CompositeViewHolder> implements ViewState<VH>, Serializable {
1116

1217
@NonNull
13-
protected final Parcelable mLayoutManagerState;
18+
protected HashMap<Integer, ViewState> mViewStates;
19+
protected int mPosition;
20+
protected int mTopOffset;
21+
protected int mLeftOffset;
1422

1523
public <VH extends CompositeViewHolder> CompositeViewState(@NonNull final VH holder) {
16-
mLayoutManagerState = holder.getRecyclerView().getLayoutManager().onSaveInstanceState();
24+
mViewStates = holder.getAdapter().getStates();
25+
final RecyclerView.LayoutManager layoutManager = holder.getRecyclerView().getLayoutManager();
26+
if (layoutManager instanceof LinearLayoutManager) {
27+
/* To get rid of Parcelable, https://stackoverflow.com/a/35287828/4894238 */
28+
mPosition = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();
29+
final View item = holder.getRecyclerView().getChildAt(0);
30+
mTopOffset = (item == null) ? 0 : (item.getTop() - holder.getRecyclerView().getPaddingTop());
31+
mLeftOffset = (item == null) ? 0 : (item.getLeft() - holder.getRecyclerView().getPaddingLeft());
32+
Log.d("###", "save mPosition: " + mPosition + " mTopOffset: " + mTopOffset);
33+
} else {
34+
mPosition = 0;
35+
mTopOffset = 0;
36+
}
1737
}
1838

1939
@Override
2040
public void restore(@NonNull final VH holder) {
21-
holder.getRecyclerView().getLayoutManager().onRestoreInstanceState(mLayoutManagerState);
41+
holder.getAdapter().setStates(mViewStates);
42+
43+
final RecyclerView.LayoutManager layoutManager = holder.getRecyclerView().getLayoutManager();
44+
if (mPosition != -1 && layoutManager instanceof LinearLayoutManager) {
45+
Log.d("###", "restore mPosition: " + mPosition + " mTopOffset: " + mTopOffset);
46+
((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(mPosition, Math.max(mTopOffset, mLeftOffset));
47+
}
2248
}
2349
}

0 commit comments

Comments
 (0)