将图像 url 存储在 sharedpreferences 中并在 Recyclerview 中显示

Store images url in sharedpreferences and display them in Recyclerview

我正在尝试向我的应用程序添加(添加到收藏夹)功能,为此我使用了 sharedpreferences 我下面的代码有效但是当我显示图像时我只看到我添加的最后一张图像并且我相信我没有将新图像添加到我最喜欢的部分,而是用旧图像替换了 :

这是我从 arraylist

添加和删除 url 的代码
  public void add(String name, String url) {
        ArrayList<Post> myfav = new ArrayList<>();
        Post post = new Post();
        post.setImgUrl(url);
        post.setName(name);
        myfav.add(post);
        TinyDB tinydb = new TinyDB(getApplicationContext());
        tinydb.putListObject("fav", myfav);
        Toast.makeText(getApplicationContext(), "added to fav", Toast.LENGTH_SHORT).show();
    }

    public void remove(String url) {
    TinyDB tinydb = new TinyDB(getApplicationContext());
    ArrayList<Post> myfavSaved;
    myfavSaved = tinydb.getListObject("fav", Post.class);
    for (int i = 0; i < myfavSaved.size(); i++) {
        if (myfavSaved.get(i).getImgUrl().equalsIgnoreCase(url)) {
            myfavSaved.remove(i);
            saveFav(myfavSaved);
        }
    }
    Toast.makeText(getApplicationContext(), "removed from fav", Toast.LENGTH_SHORT).show();
}

public void saveFav(ArrayList<Post> arrayList) {
    TinyDB tinydb = new TinyDB(getApplicationContext());
    tinydb.putListObject("fav", arrayList);
}

最喜欢的片段:我在RecyclerView

中显示图像
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_fav, container, false);
        posts = new ArrayList<>();
        recyclerView = v.findViewById(R.id.rc);
        layoutManager = new GridLayoutManager(getActivity(), 2);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);
        fetchRemoteData();
        return v;
    }

    public void onSuccess(List<Post> posts) {
        if (adapter == null) {
            adapter = new MyAdapter(posts, getActivity(), new RecyclerViewClickListener() {
                @Override
                public void onClick(View view, Post post) {
                    Intent intent = new Intent(getActivity(), Pop.class);
                    intent.putExtra("img", post.getImgUrl());
                    intent.putExtra("cat", "fav");
                    if (post.getName().isEmpty()) {
                        intent.putExtra("name", "Unknown");
                    } else {
                        intent.putExtra("name", post.getName());
                    }
                    startActivity(intent);
                    getActivity().overridePendingTransition(R.anim.fadein, R.anim.fadeout);
                }
            });
            recyclerView.setAdapter(adapter);
        } else {
            adapter.getItems().clear();
            adapter.getItems().addAll(posts);
            adapter.notifyDataSetChanged();
        }
    }

    private void fetchRemoteData() {
        TinyDB tinydb = new TinyDB(getActivity());
        ArrayList<Post> myfavSaved;
        List<Post> listItems = new ArrayList<>();
        myfavSaved = tinydb.getListObject("fav", Post.class);
        for (int i = 0; i < myfavSaved.size(); i++) {
            Post item = new Post(myfavSaved.get(i).getImgUrl(), myfavSaved.get(i).getName());
            listItems.add(item);
        }
        onSuccess(listItems);
    }
}

您总是在 add()(第一行)中添加新的 object 列表。 相反,您必须先检索列表 object,然后添加您的新收藏夹 post。

试试这个:

 public void add(String name, String url) {
    //code to retrieve your arraylist stored in SharedPrefs
    TinyDB tinydb = new TinyDB(getApplicationContext());
    ArrayList<Object> postObjects = tinydb.getListObject("fav", Post.class);
    ArrayList<Post> myfav = new ArrayList<Post>();
    for(Object objs : postObjects){
        myfav.add((Post)objs);
    }
        Post post = new Post();
        post.setImgUrl(url);
        post.setName(name);
        myfav.add(post);
        tinydb.putListObject("fav", myfav);
        Toast.makeText(getApplicationContext(), "added to fav", Toast.LENGTH_SHORT).show();
 }