我知道有几个例子,但是我尝试了很多例子,但无法解决问题。我想从共享首选项中删除一个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()
不会执行您认为的操作。您传递给它的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();