android - 从 SharedPreferences 中删除一个 ArrayList

标签 android sharedpreferences

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

我在第一个 Activity 中根据共享偏好创建我的 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 !!!
}

在我的第二个 Activity 中,我像这样检索我的数组:

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;
}

最后,我在这里删除了我的第二个 Activity 中的数组项:

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

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

最佳答案

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

关于android - 从 SharedPreferences 中删除一个 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53804615/

相关文章:

java - 清除 SharedPreference 中的单个变量

java - 每次我开始新 Activity 时,ArrayList 共享首选项都会被覆盖

android - 如何忽略 "avoid non-default constructors in fragments"错误?

android - SQLiteOpenHelper onUpgrade() 混淆Android

android - 如何在sqlite数据库中找到列的最大值

android - 在 Android 中膨胀类 Button 时出错

android - 来自辅助类的sharedPreference

java - 保存和获取具有共享首选项的微调项目

Android kotlin import synthetic if else

android - 使用 fragment 动态更新摘要偏好?