gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:06:22 33 4
gpt4 key购买 nike

我对 Android 的 RecyclerView.State 有疑问.

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

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

最佳答案

更新

recyclerview:1.2.0-alpha02 版本开始引入StateRestorationPolicy。这可能是解决给定问题的更好方法。

此主题已在 android developers medium article 上讨论过.

此外,@rubén-viguera 在下面的答案中分享了更多详细信息。 https://stackoverflow.com/a/61609823/892500

旧答案

如果你使用的是LinearLayoutManager,它自带了预建的save api linearLayoutManagerInstance.onSaveInstanceState()并恢复 api linearLayoutManagerInstance.onRestoreInstanceState(...)

这样,您可以将返回的包裹保存到您的 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());
}

编辑:您也可以使用与 GridLayoutManager 相同的 api,因为它是 LinearLayoutManager 的子类。感谢@wegsehen 的建议。

编辑:请记住,如果您还在后台线程中加载数据,则需要在 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();
}
}

关于android - 如何使用 RecyclerView.State 保存 RecyclerView 滚动位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27816217/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com