arraylist содержит повторяющиеся значения с общими настройками - PullRequest
0 голосов
/ 24 декабря 2018

Очень странная ситуация, которую я заметил ...

  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();
}

Я отлаживаю это утверждение ... проблема в том, что даже когда мой массив содержит currentArticle, он всегда говорит, что нет.

какая-либо помощь?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Ваш общий ключ идентификатора предпочтения и введенный текстовый ключ идентификатора были одинаковыми, поэтому возникла проблема.Я только что изменил положил строковый идентификатор ключа.Теперь это работает.Надеюсь, это сработает и для вас

private String FAV_LIST = "fav_list";

private void saveFavArticles() {
    SharedPreferences pref = getSharedPreferences(PUT_FAVORITE_CRNT_ARTICLE_KEY, Context.MODE_PRIVATE);
    String currentFavList = pref.getString(FAV_LIST, "");
    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(FAV_LIST, new Gson().toJson(articles));
    } else {
        editor = pref.edit();
        articles.add(currentArticle);
        editor.putString(FAV_LIST, new Gson().toJson(articles));
        Toast.makeText(this, "current article added to favorites", Toast.LENGTH_SHORT).show();
    }
    editor.commit();
   }   
 }
0 голосов
/ 24 декабря 2018

Поскольку аррэйлист статей - это список пользовательских объектов, которые необходимо переопределить методом equals, при условии, что реализация по умолчанию - это не то, что вам нужно.

Метод List.contains (...) определен дляиспользуйте equals (Object), чтобы решить, является ли объект аргумента списком.когда вы сравниваете объекты (с методом contains), он фактически сравнивает хеш-код, сгенерированный JAVA.

, поэтому класс вашей модели должен переопределить методы равно и hashCode

  @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 , в вашем случае вы можете использовать ваши переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...