哪里使用onSaveInstanceState和onRestoreInstanceState方法?

时间:2018-04-27 21:30:59

标签: android android-recyclerview onsaveinstancestate onrestoreinstancestate

这是一个概念性问题。对不起,如果这是一个简单的问题,我几天前就开始学习Android了。

当用户退出活动时,我试图保存Recyclerview的状态。我读了一些关于这个的文章。

在本文https://panavtec.me/retain-restore-recycler-view-scroll-position中,方法是:

protected Parcelable onSaveInstanceState();
protected void onRestoreInstanceState(Parcelable state);

在另一篇文章RecyclerView store / restore state between activities中,方法是:

protected void onSaveInstanceState(Bundle state)
protected void onRestoreInstanceState(Bundle state)

这两篇文章假装回答同样的问题,如何恢复回收者的状态。

问题:

1 - 第一篇文章在layoutManager上实现了这些方法!所以,我使用默认的GridLayoutManager,所以要在GridLayoutManager中实现保存和恢复实例,我应该创建自己的类来扩展默认类吗?

2 - 我可以在布局管理器中实现这些方法而不管它们在活动中实现它们吗?

3 - 实施这些方法的正确位置在哪里?或者是否有正式答案:"如何恢复再循环视图的状态?"

我正在寻找关于这三个问题的意见,而不是一个完整的实施。

1 个答案:

答案 0 :(得分:2)

  

1 - 第一篇文章在layoutManager上实现了这些方法!   所以,我使用默认的GridLayoutManager,所以要实现save和   在GridLayoutManager中恢复实例我应该创建自己的类   扩展默认类?

如果您查看文章和SO帖子,他们不会在LayoutManager实现任何内容,他们只会使用已经存在的方法。 如果您查看GridLayoutManager的文档页面,则已有onSaveInstanceState()onRestoreInstanceState (Parcelable state)方法(这两种方法是"方便的API"博客提及在开始时。)

我确定你已经注意到GridLayoutManager继承自LinearLayoutManager LinearLayoutManager.onSaveInstanceState()的官方文件:

  

当LayoutManager应保存其状态时调用。 [...]退货:   可以为LayoutManager提供可以恢复其的必要信息   状态

LinearLayoutManager.onRestoreInstanceState (Parcelable state)的官方文件 非常不完整但你可以告诉它使用了LinearLayoutManager.onSaveInstanceState()返回的相同Parcelable参数

  

2 - 无论如何,我都可以在layoutmanager中实现这些方法   在活动中实施它们?

要明确:无需重新实现LayoutManager。我不明白为什么你需要这样做,方法就在那里,随时可以使用。 您需要实现同名的Activity方法。

  

3 - 实施这些方法的正确位置在哪里?或者在那里   这个问题的正式答案:"如何恢复状态   recyclerview"

执行此操作的正确位置是活动的生命周期方法,这些方法将在适当的时间调用以保存和恢复您的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在Android中非常重要。我相信,在充分理解之后,可以就特定用例做出正确的决定。

希望这会有所帮助;)