如何将ArrayList存入SharedPreference并读取展示?
嘿,我看你已经搞定了把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()和具体元素内容。 - 确保读取时用的key
KEY_ArrayList和存入时完全一致(大小写敏感!)。 - 你的实体类要符合Gson序列化要求:要有无参构造函数,字段要么是public的,要么有对应的getter/setter(Gson可以访问private字段,但规范写法更稳妥)。
内容的提问来源于stack exchange,提问作者Kristofer
相关产品推荐
相关产品推荐

