1 - 第一篇文章在 layoutManager 上实现了这些方法!?所以,我使用的是默认的 GridLayoutManager,所以要在 GridLayoutManager 中实现保存和恢复实例,我应该创建自己的类来扩展默认类吗?
如果您同时查看文章和 SO 帖子,它们并没有在 中实现任何东西LayoutManager
,它们只是使用已经存在的方法。如果您查看GridLayoutManager的文档页面,则已经有 aonSaveInstanceState()
和 aonRestoreInstanceState (Parcelable state)
方法(这两种方法是博客开头提到的“方便的 API”)。
我相信您已经注意到GridLayoutManager
继承自LinearLayoutManager.onSaveInstanceState()LinearLayoutManager
的
官方文档:
当 LayoutManager 应该保存其状态时调用。[...] 返回:Parcelable LayoutManager 能够恢复其状态的必要信息
LinearLayoutManager.onRestoreInstanceState (Parcelable state)的官方文档
非常不完整,但你可以看出它使用了与Parcelable
LinearLayoutManager.onSaveInstanceState() 返回的相同参数
2 - 我可以在布局管理器中实现这些方法,而不管在活动中实现它们吗?
明确一点:无需重新实现 LayoutManager。我不明白你为什么需要这样做,这些方法已经存在并且可以使用。同名的Activity方法是你需要实现的。
3 - 实施这些方法的正确位置在哪里?还是这个问题有官方答案:“如何恢复recyclerview的状态?”
执行此操作的正确位置是 Activity 的生命周期方法,这些方法将在适当的时间调用以保存和恢复您的LayoutManager
状态。引用您提到的SO答案:
//---> this is the Activity's onSaveInstanceState
protected void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
// Save list state
mListState = mLayoutManager.onSaveInstanceState();
state.putParcelable(LIST_STATE_KEY, mListState);
}
//---> this is the Activity's onRestoreInstanceState
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
// Retrieve list state and list/item positions
if(state != null)
mListState = state.getParcelable(LIST_STATE_KEY);
}
//---> this is the Activity's onResume
@Override
protected void onResume() {
super.onResume();
if (mListState != null) {
mLayoutManager.onRestoreInstanceState(mListState);
}
}
我还没有看到任何关于专门恢复 RecyclerView/LayoutManager 状态的官方文档,但是生命周期主题在 Android 中是一个非常重要的主题。我相信,在充分理解这一点之后,可以就特定用例做出正确的决定。
希望这可以帮助 ;)