Удалить элементы из списка массивов, хранящихся в общих настройках - PullRequest
0 голосов
/ 18 апреля 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();
            }
        });

Тот же код, который я использовал для добавления продукта, с arraylist.add (). Что я тут не так делаю, может кто-нибудь помочь.

edit:

holder.addItems.setOnClickListener(v -> {
            //listener.setCounter(0);
            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.add(mArtikull);
                String jsonString = gson.toJson(artikullObject);
                mEditor.putString("artikujtShporta", jsonString);
                mEditor.apply();
            } else {
                ArrayList<Artikujt> arrayArtikuj = new ArrayList<>();
                arrayArtikuj.add(mArtikull);
                Type listOfTestObject = new TypeToken<ArrayList<Artikujt>>(){}.getType();
                String s = gson.toJson(arrayArtikuj, listOfTestObject);
                mEditor.putString("artikujtShporta", s);
                mEditor.apply();
            }

        });

Ответы [ 2 ]

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

Вы, вероятно, не переопределяли метод equals(Object) в своем классе Artikujt. Для выполнения договора вам также необходимо переопределить метод hashCode. Если вы можете предоставить идентификатор для идентификации ваших объектов, вы можете реализовать его следующим образом:

public class Artikujt {
    private int id;

    //Other stuff

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Artikujt artikujt = (Artikujt) o;
        return id == artikujt.id;
    }

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

Это потому, что метод List remove будет вызывать метод equals для каждого объекта, который содержится в списке, и удаляет это когда он возвращает истину. Когда вы десериализуете список из json, вы создаете совершенно разные экземпляры класса Artikujt, которые сравниваются с использованием == в вашем случае, что неверно.

Если вы используете IDE, например IntelliJ или Android Studio очень легко переопределить эти методы. Вам просто нужно выбрать поля, которые вы хотите включить в проверку на равенство, и IDE автоматически сгенерирует equals и hashcode

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

Вы используете неправильный способ удаления объекта

 artikullObject.remove(artikulli);

Приведенный выше метод удалит тот же объект из списка, но, когда вы проанализировали список из Gson, будет подготовлен новый список, и все объекты будут иметь разные объекты.

Как вы можете удалить этот объект?

Если у вас есть какой-либо уникальный идентификатор объекта, получите его индекс, повторяя l oop, затем удалите объект с этим индексом из списка.

Например, ваш класс Artikujt такой:

class Artikujt{
String uId;
// other data members..
}

// L oop ваш список, проверьте индекс элемента удалить

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) {
        int indexToRemove = -1
         for(int i=0 ; i<artikullObject.size(); i++){
           if(artikullObject.get(i).uid.equals(artikulli.uid)){
            indexToRemove = i;
            break;
           }
          }
      if(i!=-1){
        artikullObject.remove(indexToRemove);
       }

            String jsonString = gson.toJson(artikullObject);
            mEditor.putString("artikujtShporta", jsonString);
            mEditor.apply();
        }
    });
...