我无法从共享首选项中删除项目
I can't delete an item from sharedpreferences
我在导航视图中有一个项目列表 以编程方式添加 - 我使用 sharedpreferences 保存和恢复它们,一切正常 fine.But 问题是我无法从中删除项目sharedpreferences.I 使用当前单击的项目的标题检索项目索引 - 代码工作正常 - 项目位置已正确检索但未从共享首选项中删除,我无法解决此问题 works.What ?
这是我的代码:
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 class 来覆盖 equals
和 hashcode
即这里:
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();
我在导航视图中有一个项目列表 以编程方式添加 - 我使用 sharedpreferences 保存和恢复它们,一切正常 fine.But 问题是我无法从中删除项目sharedpreferences.I 使用当前单击的项目的标题检索项目索引 - 代码工作正常 - 项目位置已正确检索但未从共享首选项中删除,我无法解决此问题 works.What ?
这是我的代码:
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 class 来覆盖 equals
和 hashcode
即这里:
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();