3

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

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

在这篇文章https://panavtec.me/retain-restore-recycler-view-scroll-position方法是:

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

在另一篇文章RecyclerView 在活动之间存储/恢复状态的方法是:

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

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


问题:

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

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

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

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

4

1 回答 1

2

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

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

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

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

LinearLayoutManager.onRestoreInstanceState (Parcelable state)的官方文档 非常不完整,但你可以看出它使用了与ParcelableLinearLayoutManager.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 中是一个非常重要的主题。我相信,在充分理解这一点之后,可以就特定用例做出正确的决定。

希望这可以帮助 ;)

于 2018-04-30T00:38:29.383 回答