如何使用RecyclerView.State保存RecyclerView滚动位置?

2024-05-09

我有一个关于 Android 的问题RecyclerView.State http://developer.android.com/reference/android/support/v7/widget/RecyclerView.State.html.

我正在使用 RecyclerView,如何使用它并将其与 RecyclerView.State 绑定?

我的目的是保存RecyclerView的滚动位置.


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();
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用RecyclerView.State保存RecyclerView滚动位置? 的相关文章

随机推荐