簡體   English   中英

我無法從 sharedpreferences 中刪除項目

[英]I can't delete an item from sharedpreferences

我在導航視圖中有一個項目列表,以編程方式添加女巫 - 我使用共享首選項保存和恢復它們,一切正常。但問題是我無法從共享首選項中刪除項目。我使用標題檢索項目索引單擊當前項目 - 代碼工作正常 - 項目位置被正確檢索,但沒有從共享首選項中刪除,沒有任何效果。我能做些什么來解決這個問題?

這是我的代碼:

    private void saveData() {
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREF_LIST_KEY, MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        String json = gson.toJson(navItems);
        editor.putString(SHARED_PREF_LIST_KEY_ITEM, json);
        editor.apply();
    }

    private void loadData() {
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREF_LIST_KEY, MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString(SHARED_PREF_LIST_KEY_ITEM, null);
        Type type = new TypeToken<ArrayList<NavItem>>() {
        }.getType();
        navItems = gson.fromJson(json, type);
        if (navItems == null) {
            navItems = new ArrayList<>();
        }
    }

    private void deleteData(NavItem navItem) {
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREF_LIST_KEY, MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString(SHARED_PREF_LIST_KEY_ITEM, null);
        Type type = new TypeToken<ArrayList<NavItem>>() {
        }.getType();
        navItems = gson.fromJson(json, type);
        if (navItems != null) {
            navItems.remove(navItem);
                        Toast.makeText(this, "List " + navItem.getName() + " 
                                          deleted ", Toast.LENGTH_SHORT).show();

            saveData(); // save updated data to shared preferences
        }
    }




           int position = navViewArray.findItemString(checkItemTitle);
                                Toast.makeText(this, "position " + position, 
                                                 Toast.LENGTH_SHORT).show();

               NavItem navItem = navItems.get(position);
                deleteData(navItem);



     public class NavItem {
       private String name;

       public NavItem(String name) {
        this.name = name;
    }

       public String getName() {
        return name;
    }
}

     public class NavViewArray {
       private List<NavItem> navItems;

       public NavViewArray(List<NavItem> items) {
        this.navItems = new ArrayList<>(items);
    }

       public int findItemString(String itemName) {
        for (int i = 0; i < navItems.size(); i++) {
            NavItem navItem = navItems.get(i);
            if (itemName.equals(navItem.getName())) {
                return i;
            }
        }
        return -1;
    }

}

為了能夠使用項目本身在List找到項目,您需要實現 equals 和 hashcode。

為了這行代碼工作navItems.remove(navItem); 您需要 NavItem 類來覆蓋equalshashcode

即在這里:

public class NavItem {
   private String name;

   public NavItem(String name) {
      this.name = name;
   }

   public String getName() {
      return name;
   }

   // ADD THE BELOW

   @Override
   public boolean equals(NavItem other) {
        return name.equals(other.name);
   }

   @Override
   public int hashcode() {
       return name.hashcode();
   }

}

這是一個非常簡單的 equals 和 hashcode,您可以使用 IDE生成您的 equals 和 hashcode,這將更好地考慮所有字段。

https://www.jetbrains.com/help/idea/generate-equals-and-hashcode-wizard.html


您還可以驗證該項目是否已被刪除,因為已刪除的項目已返回:

NavItem removed= navItems.remove(navItem);
Toast.makeText(this, "List " + removed.getName() + "deleted ",b Toast.LENGTH_SHORT).show();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM