gpt4 book ai didi

android - 当用户旋转手机并将所有数据保留在 ArrayAdapter 中时,保留 ListView 项的良好解决方案

转载 作者:IT王子 更新时间:2023-10-28 23:59:43 24 4
gpt4 key购买 nike

我正在使用带有 listView 的 Fragment。我通过自定义加载程序(来自互联网)中接收的数据填充与此 ListView 关联的 ArrayAdapter。自定义 ArrayAdapter 支持无限滚动(分页)。

当用户旋转设备并在 ListView 中保持滚动位置时,在 ArrayAdapter 中存储项目的最佳方式是什么?

我正在考虑使用 ArrayAdapter 创建非可视 Fragment,并使用 setRetainInstance 方法保存值。

对更好的解决方案有什么建议吗?

最佳答案

要使用 Android 框架和 Fragment 生命周期,您应该在 Fragment 中实现 onSaveInstanceState 方法。为简单起见,我假设您有一个可以访问的 String 值数组(我通常扩展 ArrayAdapter 以封装 View 构造并提供访问整个底层数据集的便捷方法):

public void onSaveInstanceState(Bundle savedState) {

super.onSaveInstanceState(savedState);

// Note: getValues() is a method in your ArrayAdapter subclass
String[] values = mAdapter.getValues();
savedState.putStringArray("myKey", values);

}

然后您可以在 onCreate 方法(或 onCreateView 或 onActivityCreated - 参见 the Fragment JavaDoc)中检索数据,如下所示:

public void onCreate (Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

if (savedInstanceState != null) {
String[] values = savedInstanceState.getStringArray("myKey");
if (values != null) {
mAdapter = new MyAdapter(values);
}
}

...

}

这可确保正确处理所有生命周期事件,而不会丢失数据,包括设备旋转和用户切换到其他应用程序。不使用 onSaveInstanceState 并使用内存的危险是 Android 回收该内存的危险。保存状态不会受此影响,但使用实例变量或隐藏 fragment 会导致数据丢失。

如果 savedStateInstance 为 null,则没有要恢复的状态。

if (values != null) 只是为了防止没有保存数组的可能性,但是如果您编写 ArrayAdapter 来处理空数据集,则不需要它。

如果您的行是您自己的类之一而不是单个数据项的实例,最终的解决方案是在该类上实现 Parcelable 接口(interface),那么您可以使用 savedState.putParcelableArray("myKey", myArray )。你会惊讶于知道如何实现 Parcelable 是多么有用——它允许你在内部 Intent 中传递你的类并允许你编写更简洁的代码。

关于android - 当用户旋转手机并将所有数据保留在 ArrayAdapter 中时,保留 ListView 项的良好解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16692536/

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