You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ArrayList存入SharedPreference并读取展示?

解决SharedPreferences读取ArrayList内容不完整的问题

嘿,我看你已经搞定了把ArrayList存入SharedPreferences的部分,现在读取环节遇到内容不完整的问题对吧?这大概率是因为泛型类型擦除导致的,我来帮你补全正确的读取代码,顺便说下关键注意点~

完整的读取代码

// 获取SharedPreferences实例,和存入时的文件名保持一致
SharedPreferences prefs = getActivity().getSharedPreferences("ShoppingListFile", Context.MODE_PRIVATE);
// 取出存储的JSON字符串,默认值设为"[]"避免空指针
String json = prefs.getString("KEY_ArrayList", "[]");
Gson gson = new Gson();

// 核心:用TypeToken指定ArrayList的具体泛型类型,解决类型擦除问题
Type itemListType = new TypeToken<ArrayList<YourItemClass>>() {}.getType();
ArrayList<YourItemClass> itemList = gson.fromJson(json, itemListType);

关键说明

  • 替换YourItemClass:一定要把这个改成你实际的实体类名称(比如你的ArrayList里存的是ShoppingItem对象,就写ArrayList<ShoppingItem>)。
  • 为什么要用TypeToken?:Java在运行时会擦除泛型信息,如果直接写gson.fromJson(json, ArrayList.class),Gson无法知道列表里装的是什么类型的对象,会默认转成ArrayList<LinkedTreeMap>,这就会导致你读取到的数据结构混乱、内容不完整。
  • 默认值"[]":如果之前没有存过数据,这个默认值会让你得到一个空的ArrayList,避免后续操作出现空指针异常。

额外排查点

如果还是有问题,可以检查这几点:

  • 存入前确认itemList确实包含完整数据,比如打Log输出itemList.size()和具体元素内容。
  • 确保读取时用的keyKEY_ArrayList和存入时完全一致(大小写敏感!)。
  • 你的实体类要符合Gson序列化要求:要有无参构造函数,字段要么是public的,要么有对应的getter/setter(Gson可以访问private字段,但规范写法更稳妥)。

内容的提问来源于stack exchange,提问作者Kristofer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:50:01