gpt4 book ai didi

android - 在哪里使用 onSaveInstanceState 和 onRestoreInstanceState 方法?

转载 作者:搜寻专家 更新时间:2023-11-01 09:26:45 26 4
gpt4 key购买 nike

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

当用户退出 Activity 时,我试图保存 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 - 我可以在布局管理器中实现这些方法,而不管它们是否在 Activity 中实现?

3 - 实现这些方法的正确位置在哪里?或者是否有官方回答这个问题:“如何恢复 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 帖子,它们不会实现LayoutManager 中的任何内容,它们只是使用已经存在的方法。如果您查看 GridLayoutManager 的文档页面已经有 onSaveInstanceState()onRestoreInstanceState (Parcelable state) 方法(这两个方法是博客一开始提到的“便捷 API”)。

我相信您已经注意到 GridLayoutManager 继承自 LinearLayoutManagerLinearLayoutManager.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是Android中非常重要的一个。我相信,在充分理解这一点之后,可以针对特定用例做出正确的决定。

希望这有帮助;)

关于android - 在哪里使用 onSaveInstanceState 和 onRestoreInstanceState 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50070562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com