Невозможно удалить объект из ArrayList <Object>, сохраненного в json - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть корзина, в которой я хочу удалить продукт, но у меня возникла проблема. Я могу добавить товар в корзину и сохранить в общих настройках, но когда я хочу удалить его, но он не работает. Вот что я сделал:

holder.removeProduct.setOnClickListener(v -> {
            SharedPreferences preferences = mContext.getSharedPreferences(ITEMS_PREF, Context.MODE_PRIVATE);
            SharedPreferences.Editor mEditor = preferences.edit();
            Gson gson = new Gson();
            String json = preferences.getString("artikujtShporta", "");
            ArrayList<Artikujt> artikullObject = gson
                    .fromJson(json, new TypeToken<ArrayList<Artikujt>>(){}.getType());

            if (artikullObject != null) {
                artikullObject.remove(artikulli);
                String jsonString = gson.toJson(artikullObject);
                mEditor.putString("artikujtShporta", jsonString);
                mEditor.apply();
            } else {
                ArrayList<Artikujt> arrayArtikuj = new ArrayList<>();
                arrayArtikuj.remove(artikulli);
                Type listOfTestObject = new TypeToken<ArrayList<Artikujt>>(){}.getType();
                String s = gson.toJson(arrayArtikuj, listOfTestObject);
                mEditor.putString("artikujtShporta", s);
                mEditor.apply();
            }
        });

То же самое, что я сделал для добавления продукта, с той разницей, что здесь я называю

artikullObject.remove(artikulli);

Чего мне не хватает?

1 Ответ

1 голос
/ 18 апреля 2020

В чем проблема?

Проблема здесь будет в том, что экземпляр вашего класса Artikujt, который вы хотите удалить из массива, отличается от того, который вы прочитали из предпочтений.

Как только вы используете Gson, чтобы превратить вашу строку в новый массив, она будет генерировать совершенно новые экземпляры вашего класса, и, очевидно, они не будут такими же, как раньше. Может быть, они равны, но они не одинаковые экземпляры.

Что вы можете сделать, чтобы решить эту проблему?

Я предполагаю, что вы хотите иметь каждый Artikujt только один раз. Что означает, что вы также можете использовать HashSet. Преимущество этого в том, что он будет использовать функцию hashCode(), чтобы определить, какой экземпляр в наборе вы хотите удалить. Так что вам просто нужно переопределить эту функцию hashCode() в вашем классе модели и использовать все ее свойства для вычисления хеш-кода. Вы можете найти пример здесь: https://www.sitepoint.com/how-to-implement-javas-hashcode-correctly/

Sidenote

Ваш блок else не нужен. Это не имеет большого смысла. Вы создаете пустой ArrayList, затем удаляете sth из этого пустого списка, а затем сохраняете этот пустой список в общих настройках. Логика c вашего кода не изменится, если вы просто удалите этот блок else.

...