在哪里使用 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=中是一个非常重要的文档].我相信在充分理解这一点之后,可以针对特定用例做出正确的决定。

希望这对您有所帮助 ;)