-
-
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(); | |
} | |
} |
Thanks a lot.
Working for me too, tested it on Android 6, 8 and 9 devices.
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 for the code. It's Working!