SharedPreferences存图片URL至RecyclerView,收藏功能仅显示最后一张问题
问题分析与解决方案
你遇到的问题很典型——每次添加收藏时都创建了新的ArrayList,完全没有读取已有的收藏数据,所以新添加的内容直接覆盖了旧数据,自然只能看到最后一条。
问题出在这行代码
每次调用add方法时,你都重新初始化了一个空列表:
ArrayList<Post> myfav = new ArrayList<>();
这意味着你没有从SharedPreferences(TinyDB)里加载之前保存的收藏列表,每次都是在新列表里加一条,然后保存覆盖掉旧的,旧数据当然就丢了。
修正后的add方法
正确的做法是:先读取已有的收藏列表,再把新内容追加进去,最后保存更新后的列表。代码示例如下:
public void add(String name, String url) { // 1. 先从TinyDB读取已有的收藏列表,如果没有就创建空列表 TinyDB tinydb = new TinyDB(context); // 这里要传入你的上下文对象 ArrayList<Post> myfav = tinydb.getListObject("favorites", Post.class); // 处理首次收藏的情况(列表为空) if (myfav == null) { myfav = new ArrayList<>(); } // 2. 创建新的Post对象并添加到列表 Post post = new Post(); post.setImgUrl(url); post.setName(name); myfav.add(post); // 3. 将更新后的列表保存回TinyDB tinydb.putListObject("favorites", myfav); }
配套的remove方法(可选)
如果要实现移除收藏,同样要先读取列表,找到对应项移除后再保存:
public void remove(String url) { TinyDB tinydb = new TinyDB(context); ArrayList<Post> myfav = tinydb.getListObject("favorites", Post.class); if (myfav != null) { // 遍历列表找到要移除的Post(这里用url作为唯一标识,你也可以用name或其他字段) Iterator<Post> iterator = myfav.iterator(); while (iterator.hasNext()) { Post post = iterator.next(); if (post.getImgUrl().equals(url)) { iterator.remove(); break; } } // 保存更新后的列表 tinydb.putListObject("favorites", myfav); } }
重要前提:Post类必须可序列化
因为TinyDB要把ArrayListPost类需要实现Serializable接口,否则会保存失败:
public class Post implements Serializable { private String imgUrl; private String name; // getter和setter方法 public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
这样修改后,每次添加收藏都会在原有列表基础上追加新内容,就不会再覆盖旧数据啦!
内容的提问来源于stack exchange,提问作者ali
相关产品推荐
相关产品推荐

