-
-
Save BrianLusina/be98f7577b3dc644dbeab98fa57c3f53 to your computer and use it in GitHub Desktop.
Retain & restore recycler view scroll position
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package eu.f3rog.ui.custom; | |
import android.content.Context; | |
import android.os.Bundle; | |
import android.os.Parcelable; | |
import android.support.annotation.Nullable; | |
import android.support.v7.widget.RecyclerView; | |
import android.util.AttributeSet; | |
/** | |
* Class {@link StatefulRecyclerView} extends {@link RecyclerView} and adds position management on configuration changes. | |
* | |
* @author FrantisekGazo | |
* @version 2016-03-15 | |
*/ | |
public final class StatefulRecyclerView | |
extends RecyclerView { | |
private static final String SAVED_SUPER_STATE = "super-state"; | |
private static final String SAVED_LAYOUT_MANAGER = "layout-manager-state"; | |
private Parcelable mLayoutManagerSavedState; | |
public StatefulRecyclerView(Context context) { | |
super(context); | |
} | |
public StatefulRecyclerView(Context context, @Nullable AttributeSet attrs) { | |
super(context, attrs); | |
} | |
public StatefulRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { | |
super(context, attrs, defStyle); | |
} | |
@Override | |
protected Parcelable onSaveInstanceState() { | |
Bundle bundle = new Bundle(); | |
bundle.putParcelable(SAVED_SUPER_STATE, super.onSaveInstanceState()); | |
bundle.putParcelable(SAVED_LAYOUT_MANAGER, this.getLayoutManager().onSaveInstanceState()); | |
return bundle; | |
} | |
@Override | |
protected void onRestoreInstanceState(Parcelable state) { | |
if (state instanceof Bundle) { | |
Bundle bundle = (Bundle) state; | |
mLayoutManagerSavedState = bundle.getParcelable(SAVED_LAYOUT_MANAGER); | |
state = bundle.getParcelable(SAVED_SUPER_STATE); | |
} | |
super.onRestoreInstanceState(state); | |
} | |
/** | |
* Restores scroll position after configuration change. | |
* <p> | |
* <b>NOTE:</b> Must be called after adapter has been set. | |
*/ | |
private void restorePosition() { | |
if (mLayoutManagerSavedState != null) { | |
this.getLayoutManager().onRestoreInstanceState(mLayoutManagerSavedState); | |
mLayoutManagerSavedState = null; | |
} | |
} | |
@Override | |
public void setAdapter(Adapter adapter) { | |
super.setAdapter(adapter); | |
restorePosition(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment