Update
从...开始recyclerview:1.2.0-alpha02
发布StateRestorationPolicy
已被介绍。这可能是解决给定问题的更好方法。
该主题已被涵盖Android 开发者媒体文章 https://medium.com/androiddevelopers/restore-recyclerview-scroll-position-a8fbdc9a9334.
此外,@rubén-viguera 在下面的答案中分享了更多详细信息。https://stackoverflow.com/a/61609823/892500 https://stackoverflow.com/a/61609823/892500
旧答案
如果您使用 LinearLayoutManager,它带有预构建的保存 apiLinearLayoutManager Instance.onSaveInstanceState() http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/android/support/v7/widget/LinearLayoutManager.java#LinearLayoutManager.onSaveInstanceState%28%29并恢复apiLinearLayoutManager Instance.onRestoreInstanceState(...) http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/android/support/v7/widget/LinearLayoutManager.java#LinearLayoutManager.onRestoreInstanceState%28android.os.Parcelable%29
这样,您就可以将返回的 Parcelable 保存到您的 outState 中。例如。,
outState.putParcelable("KeyForLayoutManagerState", linearLayoutManagerInstance.onSaveInstanceState());
,并按照保存的状态恢复恢复位置。例如,
Parcelable state = savedInstanceState.getParcelable("KeyForLayoutManagerState");
linearLayoutManagerInstance.onRestoreInstanceState(state);
总而言之,您的最终代码将类似于
private static final String BUNDLE_RECYCLER_LAYOUT = "classname.recycler.layout";
/**
* This is a method for Fragment.
* You can do the same in onCreate or onRestoreInstanceState
*/
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if(savedInstanceState != null)
{
Parcelable savedRecyclerLayoutState = savedInstanceState.getParcelable(BUNDLE_RECYCLER_LAYOUT);
recyclerView.getLayoutManager().onRestoreInstanceState(savedRecyclerLayoutState);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(BUNDLE_RECYCLER_LAYOUT, recyclerView.getLayoutManager().onSaveInstanceState());
}
Edit:您还可以对 GridLayoutManager 使用相同的 api,因为它是 LinearLayoutManager 的子类。感谢@wegsehen 的建议。
Edit:请记住,如果您还在后台线程中加载数据,则需要在 onPostExecute/onLoadFinished 方法中调用 onRestoreInstanceState,以便在方向更改时恢复位置,例如
@Override
protected void onPostExecute(ArrayList<Movie> movies) {
mLoadingIndicator.setVisibility(View.INVISIBLE);
if (movies != null) {
showMoviePosterDataView();
mDataAdapter.setMovies(movies);
mRecyclerView.getLayoutManager().onRestoreInstanceState(mSavedRecyclerLayoutState);
} else {
showErrorMessage();
}
}