【问题标题】:Where use onSaveInstanceState and onRestoreInstanceState methods?在哪里使用 onSaveInstanceState 和 onRestoreInstanceState 方法?
【发布时间】:2018-04-27 21:30:59
【问题描述】:

这是一个概念问题。对不起,如果这是一个简单的问题,我几天前开始学习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)

这两篇文章假装回答同一个问题,如何恢复recyclerview的状态。


问题:

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

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

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

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

【问题讨论】:

    标签: android android-recyclerview onsaveinstancestate onrestoreinstancestate


    【解决方案1】:

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

    如果您同时查看文章和 SO 帖子,它们并没有实现LayoutManager 中的任何内容,它们只是使用已经存在的方法。 如果您查看 GridLayoutManager 的文档页面,那么已经有 onSaveInstanceState()onRestoreInstanceState (Parcelable state) 方法(这两种方法是博客开头提到的“便捷 API”)。

    我相信你已经注意到 GridLayoutManager 继承自 LinearLayoutManager LinearLayoutManager.onSaveInstanceState()的官方文档:

    当 LayoutManager 应该保存其状态时调用。 [...]返回: Parcelable LayoutManager 能够恢复其所需的信息 状态

    LinearLayoutManager.onRestoreInstanceState (Parcelable state)的官方文档 非常不完整,但您可以看出它使用了相同的 Parcelable LinearLayoutManager.onSaveInstanceState() 返回的参数

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

    明确一点:不需要重新实现 LayoutManager。我不明白你为什么需要这样做,这些方法已经存在并且可以使用。 同名的Activity方法是你需要实现的。

    3 - 实施这些方法的正确位置在哪里?或者在那里 对这个问题的官方回答:“如何恢复一个 回收站视图?”

    执行此操作的正确位置是 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 在 Android 中是一个非常重要的文档。我相信在充分了解这一点后,可以针对特定用例做出正确的决定。

    希望这会有所帮助;)

    【讨论】:

    • 好的,谢谢你的回答,你能回答我吗,为什么我在尝试使用签名“受保护的 Parcelable onSaveInstanceState()”和@Override 注释时(如问题中的链接)我收到“方法不会覆盖其超类中的方法”(我正在尝试在 Activity 上使用此签名)。但是当我使用这个签名“protected void onSaveInstanceState(Bundle state)”时一切正常吗?
    • @romeuBraga 是的,我认为您可能会混淆这两个签名(这是可以理解的,因为这些方法具有相同的名称) - 正确的 Activity 签名是这里的一个:developer.android.com/reference/android/app/… 第一个没有t 工作,因为您试图覆盖 LinearLayoutManager.onSaveInstanceState() 方法 - 换句话说,该方法在 Activity 类中不存在;)
    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多