从SharedPreferences中删除ArrayList



我知道有几个这样的例子,但我尝试了很多,但都无法解决我的问题。我想从我的共享首选项中删除一个ArrayList。

我在第一个活动中根据共享偏好创建我的ArrayList:

public void saveArrayList(ArrayList<String> list){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(list);
editor.putString("testShared", json);
editor.apply();     // This line is IMPORTANT !!!
}

在我的第二次活动中,我检索我的数组,如下所示:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_food_basket);
alreadyAddedFoodtest = (ListView) findViewById(R.id.alreadyAddedList);
registerForContextMenu(alreadyAddedFoodtest);
getArrayList();

}
public ArrayList<String> getArrayList(){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(AddFoodBasket.this);
Gson gson = new Gson();
String json = prefs.getString("testShared", null);
Type type = new TypeToken<ArrayList<String>>() {}.getType();
itemsAdded=gson.fromJson(json, type);
return itemsAdded;
}

最后,我在这里删除了第二次活动中的数组项目:

public boolean onContextItemSelected(MenuItem item){
if(item.getItemId()==R.id.delete){
AddFood add=new AddFood();
count--;
countTextbasket(count);
Toast.makeText(getApplicationContext(),"Διαγράφηκε"+item,Toast.LENGTH_LONG).show();
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); // init the info the position from
itemsAdded.remove(info.position); // remove the item from the list
addedAdapter.notifyDataSetChanged();//updating the adapter
SharedPreferences preferences = getSharedPreferences("testShared", MODE_PRIVATE);
preferences.edit().clear().apply();
}else{
return false;
}
return true;
}

问题是

SharedPreferences preferencesgetSharedPreferences("testShared", MODE_PRIVATE); preferences.edit().clear().apply();

不起作用,所以当我再次打开我的活动时,列表又出现了。

getSharedPreferences()不会做你认为它会做的事情。传递给它的字符串是SharedPreferences集合的名称,存储在该实例中的任何内容都将在其自己的文件中。

例如,使用

getSharedPreferences("hello", ...).edit().putString("test", "something").apply();

将在应用程序的数据目录(preferences_hello.xml(中创建一个全新的文件,存储test/something密钥/值。

getSharedPreferences()没有得到特定的偏好,它得到了一组特定的偏好。getDefaultSharedPreferences()实际上在内部调用getSharedPreferences()并传递应用程序的包名称。

您当前正在将testShared保存为默认的SharedPreferences(getDefaultSharedPreferences()(。如果要清除该值,请使用

PreferenceManager.getDefaultSharedPreferences(context).edit().remove("testShared").apply();

当您清除prefs时,您将执行以下操作:

SharedPreferences preferences = getSharedPreferences("testShared", MODE_PRIVATE);

这意味着您想要一个具有该名称的特定首选项集。您的其他首选项没有命名,因此它们将是一个不同的集合。

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(AddFoodBasket.this);

使用完全相同的方法获取首选项,然后将您想要的键设置为null,或者如果您想要删除所有首选项,您可以clear()它们。

最新更新