在哪里使用 onSaveInstanceState 和 onRestoreInstanceState 方法?
Where use onSaveInstanceState and onRestoreInstanceState methods?
这是概念问题。对不起,如果是个简单的问题,我前几天开始学习Android
当用户退出 activity 时,我试图保存 recyclerview 的状态。我读了一些关于这个的文章。
本文https://panavtec.me/retain-restore-recycler-view-scroll-position中的方法是:
protected Parcelable onSaveInstanceState();
protected void onRestoreInstanceState(Parcelable state);
在另一篇文章 中,方法是:
protected void onSaveInstanceState(Bundle state)
protected void onRestoreInstanceState(Bundle state)
这两篇文章假装回答同一个问题,如何恢复recyclerview的状态。
问题:
1 - 第一篇文章在layoutManager上实现了这些方法!?所以,我使用默认的 GridLayoutManager,所以要在 GridLayoutManager 中实现保存和恢复实例,我应该创建自己的 class 扩展默认值 class?
2 - 我可以在布局管理器中实现这些方法,而不管在 activity?
中实现它们
3 - 实施这些方法的正确位置在哪里?还是这个问题有官方答案:"How restore the state of a recyclerview?"
我正在寻找关于这三个问题的意见,而不是完整的实施。
1 - The first article implements these methods on a layoutManager!?
So, I'm using a default GridLayoutManager, so to implement save and
restore instance in the GridLayoutManager I should create my own class
extending the default class?
如果您同时查看文章和 SO post,它们不会 实现 LayoutManager
中的任何内容,它们只是使用已经存在的方法.
如果您查看 GridLayoutManager 的文档页面,已经有 onSaveInstanceState()
和 onRestoreInstanceState (Parcelable state)
方法(这两种方法是博客开头提到的 "convenient API" ) .
我相信你已经注意到 GridLayoutManager
继承自 LinearLayoutManager
LinearLayoutManager.onSaveInstanceState()的官方文档:
Called when the LayoutManager should save its state. [...] Returns:
Parcelable Necessary information for LayoutManager to be able to restore its
state
LinearLayoutManager.onRestoreInstanceState (Parcelable state)的官方文档
非常不完整,但您可以看出它使用 LinearLayoutManager.onSaveInstanceState()
返回的相同 Parcelable
参数
2 - I can implement these methods in the layoutmanager regardless of
implementing them in the activity?
明确一点:无需重新实现 LayoutManager。我不明白你为什么需要这样做,这些方法已经准备好可以使用了。
Activity同名方法是你需要实现的。
3 - Where is the correct place to implement these methods? or is there
a official answer to the question: "How restore the state of a
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状态的官方文档,但是lifecycle subject在[=47=中是一个非常重要的文档].我相信在充分理解这一点之后,可以针对特定用例做出正确的决定。
希望这对您有所帮助 ;)
这是概念问题。对不起,如果是个简单的问题,我前几天开始学习Android
当用户退出 activity 时,我试图保存 recyclerview 的状态。我读了一些关于这个的文章。
本文https://panavtec.me/retain-restore-recycler-view-scroll-position中的方法是:
protected Parcelable onSaveInstanceState();
protected void onRestoreInstanceState(Parcelable state);
在另一篇文章
protected void onSaveInstanceState(Bundle state)
protected void onRestoreInstanceState(Bundle state)
这两篇文章假装回答同一个问题,如何恢复recyclerview的状态。
问题:
1 - 第一篇文章在layoutManager上实现了这些方法!?所以,我使用默认的 GridLayoutManager,所以要在 GridLayoutManager 中实现保存和恢复实例,我应该创建自己的 class 扩展默认值 class?
2 - 我可以在布局管理器中实现这些方法,而不管在 activity?
中实现它们3 - 实施这些方法的正确位置在哪里?还是这个问题有官方答案:"How restore the state of a recyclerview?"
我正在寻找关于这三个问题的意见,而不是完整的实施。
1 - The first article implements these methods on a layoutManager!? So, I'm using a default GridLayoutManager, so to implement save and restore instance in the GridLayoutManager I should create my own class extending the default class?
如果您同时查看文章和 SO post,它们不会 实现 LayoutManager
中的任何内容,它们只是使用已经存在的方法.
如果您查看 GridLayoutManager 的文档页面,已经有 onSaveInstanceState()
和 onRestoreInstanceState (Parcelable state)
方法(这两种方法是博客开头提到的 "convenient API" ) .
我相信你已经注意到 GridLayoutManager
继承自 LinearLayoutManager
LinearLayoutManager.onSaveInstanceState()的官方文档:
Called when the LayoutManager should save its state. [...] Returns: Parcelable Necessary information for LayoutManager to be able to restore its state
LinearLayoutManager.onRestoreInstanceState (Parcelable state)的官方文档 非常不完整,但您可以看出它使用 LinearLayoutManager.onSaveInstanceState()
返回的相同Parcelable
参数
2 - I can implement these methods in the layoutmanager regardless of implementing them in the activity?
明确一点:无需重新实现 LayoutManager。我不明白你为什么需要这样做,这些方法已经准备好可以使用了。 Activity同名方法是你需要实现的。
3 - Where is the correct place to implement these methods? or is there a official answer to the question: "How restore the state of a 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状态的官方文档,但是lifecycle subject在[=47=中是一个非常重要的文档].我相信在充分理解这一点之后,可以针对特定用例做出正确的决定。
希望这对您有所帮助 ;)