arraylist包含具有共享首选项的重复值

雅法

我注意到一个非常奇怪的情况……

  private void saveFavArticles() {
    SharedPreferences pref = getSharedPreferences(PUT_FAVORITE_CRNT_ARTICLE_KEY, Context.MODE_PRIVATE);
    String currentFavList = pref.getString(PUT_FAVORITE_CRNT_ARTICLE_KEY, "");
    SharedPreferences.Editor editor;
    ArrayList<Article> articles = new ArrayList<>();
    //if we have favorite articles
    if(currentFavList != "") {
        Type type = new TypeToken<List<Article>>(){}.getType();
        articles = new Gson().fromJson(currentFavList, type);
        //It returns true if the specified element is found in the list else it gives false.
        if(articles.contains(currentArticle))
            Toast.makeText(this, "this article exists into favorite list", Toast.LENGTH_SHORT).show();
        else{
            articles.add(currentArticle);
            Toast.makeText(this, "current article added to favorites", Toast.LENGTH_SHORT).show();
        }
        editor = pref.edit();
        editor.putString(DetailsActivity.PUT_FAVORITE_CRNT_ARTICLE_KEY, new Gson().toJson(articles));
    }else {
        editor = pref.edit();
        articles.add(currentArticle);
        editor.putString(DetailsActivity.PUT_FAVORITE_CRNT_ARTICLE_KEY, new Gson().toJson(articles));
        Toast.makeText(this, "current article added to favorites", Toast.LENGTH_SHORT).show();
    }
    editor.commit();
}

我正在调试此语句…问题是,即使我的arraylist包含currentArticle,它也总是说不是。

有什么帮助吗?

Achanta

由于商品arraylist是自定义对象的列表,因此您需要重写equals方法,并假设默认实现不是您所需要的。

List.contains(...)方法定义为使用equals(Object)来确定参数对象是否由列表“包含”。当您比较对象(带有contains方法)时,它实际上是比较JAVA生成的哈希码。

因此您的模型类必须重写equalshashCode方法

  @Override
public boolean equals(final Object object) {

    if (object instanceof Selector) {

        Selector target = (Selector) object;

        return target.name.equalsIgnoreCase(name);

    }

    return false;

}

@Override
public int hashCode() {
    return toString().hashCode();
}

我的样本模型类是

public final class Selector {

    private String name;

    public Selector(final String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }

    @Override
    public boolean equals(final Object object) {

        if (object instanceof Selector) {

            Selector target = (Selector) object;

            return target.name.equalsIgnoreCase(name);

        }

        return false;

    }

    @Override
    public int hashCode() {
        return toString().hashCode();
    }

}

在这里,我正在根据NAME比较我的对象,您可以使用变量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章