【问题标题】:I can't delete an item from sharedpreferences我无法从 sharedpreferences 中删除项目
【发布时间】:2020-06-25 11:35:57
【问题描述】:

我在 navigationview 中有一个项目列表,女巫是以编程方式添加的 - 我使用 sharedpreferences 保存和恢复它们,一切正常。但问题是我无法从 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;
    }

}

【问题讨论】:

    标签: android arraylist sharedpreferences navigationview menu-items


    【解决方案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();
       }
    
    }
    

    这是一个非常简单的等号和哈希码,您可以使用 IDE生成您的等号和哈希码,这样可以更好地考虑所有字段。

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

    【讨论】:

    • 好的,我试试。
    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多