我有一张ArrayList美元的带定制物品的票.每个自定义对象包含各种字符串和数字.我需要数组留下来,即使用户离开活动,然后希望稍后再回来,但是在应用程序完全关闭后,我不需要数组可用.我使用SharedPreferences以这种方式保存了很多其他对象,但是我不知道如何以这种方式保存我的整个array.这个是可能的吗?也许SharedPreferences不是解决这件事的方法?有没有更简单的方法?

推荐答案

API 11之后,SharedPreferences Editor接受Sets.你可以把你的列表转换成HashSet或类似的格式,然后像那样存储.当你把它读回来时,把它转换成ArrayList,如果需要的话对它进行排序,你就可以开始了.

//Retrieve the values
Set<String> set = myScores.getStringSet("key", null);

//Set the values
Set<String> set = new HashSet<String>();
set.addAll(listOfExistingScores);
scoreEditor.putStringSet("key", set);
scoreEditor.commit();

您还可以序列化ArrayList,然后将其保存/读取到SharedPreferences.以下是解决方案:

EDIT:
Ok, below is the solution to save ArrayList as a serialized object to SharedPreferences and then read it from SharedPreferences.

因为API只支持在SharedReferences之间存储和检索字符串(在API 11之后更简单),所以我们必须序列化和反序列化ArrayList对象,该对象包含一个字符串中的任务列表.

在TaskManagerApplication类的addTask()方法中,我们必须获取共享首选项的实例,然后使用putString()方法存储序列化的ArrayList:

public void addTask(Task t) {
  if (null == currentTasks) {
    currentTasks = new ArrayList<task>();
  }
  currentTasks.add(t);
 
  // save the task list to preference
  SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
  Editor editor = prefs.edit();
  try {
    editor.putString(TASKS, ObjectSerializer.serialize(currentTasks));
  } catch (IOException e) {
    e.printStackTrace();
  }
  editor.commit();
}

同样,我们必须从onCreate()方法中的首选项中检索任务列表:

public void onCreate() {
  super.onCreate();
  if (null == currentTasks) {
    currentTasks = new ArrayList<task>();
  }
 
  // load tasks from preference
  SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
 
  try {
    currentTasks = (ArrayList<task>) ObjectSerializer.deserialize(prefs.getString(TASKS, ObjectSerializer.serialize(new ArrayList<task>())));
  } catch (IOException e) {
    e.printStackTrace();
  } catch (ClassNotFoundException e) {
    e.printStackTrace();
  }
}

您可以从ApachePig项目ObjectSerializer.java获得ObjectSerializer

Android相关问答推荐

无法理解Kotlin Coroutines and Flows中的J.C.编程行为

替换- prop -中的值(adb shell getprop)

用于小部件泄漏警告的伙伴对象中的Kotlin Lateinit

Android系统应用程序启用编程以太网网络共享

DocumentFile.canWrite()、DocumentFile.Existes()-使用本地内置手机存储(而不是云)时性能较差(占用太多CPU时间)

Android在NavHost中的LazyColumn中编写约束布局:error - replace()在未放置的项目上调用

弹出导航堆栈后,Compose 无法访问 Hilt View Model

Android Studio Relay插件(版本0.3.07)错误

如何在Android Studio中删除项目

当 EditText 用于在 android studio 中将字符串发送到 firebase 时,仅允许安全调用错误

当 Jetpack Compose 中的第一个文本很长时,将省略号添加到第一个文本

是什么导致调用 Firebase 服务器?

组成不重叠的元素

单击过go 的文章时 NewsApp 崩溃

Android collectAsStateWithLifecycle() 不在可组合内部收集

我的观点在jetpack compose中相互重叠

房间创建三四表关系

Android:为什么 ICICI iMobile Pay 应用程序在我的应用程序中显示root/jailbroken设备?

Android:在模块 jetified-play-services-measurement 和 jetified-play-services-measurement-impl 中发现重复类

使用 Android 字符串数组在 Room 中迁移