从SharedPreferences中删除ArrayList

时间:2018-12-16 17:14:30

标签: android sharedpreferences

我知道有几个示例,但我尝试了其中的许多示例,但无法解决问题。我想从共享首选项中删除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();

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

2 个答案:

答案 0 :(得分:1)

getSharedPreferences()并没有您认为的那样。您传递给它的String是该组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();

答案 1 :(得分:1)

清除偏好时,您可以执行以下操作:

| (value & mask)

这意味着您想要使用该名称设置特定的首选项。您的其他偏好设置未命名,因此它们将是不同的设置。

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

使用完全相同的方法获取首选项,然后将您要设置的键设置为null,或者如果要删除所有首选项,则可以SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(AddFoodBasket.this);