-
-
Save FrantisekGazo/a9cc4e18cee42199a287 to your computer and use it in GitHub Desktop.
| 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(); | |
| } | |
| } |
How to use this one? Please tell me an example
The usage is as @jrm-d wrote:
For people asking how to use it: import the file in your project, and just declare your StatefulRecyclerview in your layout files instead of the native "android.support.v7.widget.RecyclerView"
But I didn't use it in a long time (3 years old snippet)
Error inflating class StatefulRecyclerView
How to use this code?
Please explain a full person or send an example
Thank you for the code, this works inside fragment ๐ , but not working inside activity ๐
How to use this code?
Please explain a full person or send an example
Worked fine. Thanks
If you are looking for a solution, don't do like that, you will never know how to use the code.
Now do like this:
All below code you put in the activity (where you using the Recyclerview)
// save position:
RecyclerView rcv = findViewById(.....);
rcv.setAdapter(....);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
rcv.setLayoutManager(layoutManager);
rcv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
pos = layoutManager.findFirstVisibleItemPosition();
// everytime you scroll the list, new position will be saved in app's data storage:
SharedPreferences preferences = getSharedPreferences("anyname", MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("KEY_LAST_POSITION", pos).apply();
}
});
// using position:
SharedPreferences preferences = getSharedPreferences("anyname", MODE_PRIVATE);
int position = preferences.getInt("KEY_LAST_POSITION", 0); // 0 is the default value
rcv.scrollToPosition(position);
@chieuancucbo you don't know your code. It is remembering an item position, not the exact scroll.
Thanks a lot.
Working for me too, tested it on Android 6, 8 and 9 devices.