Android SharedPreferences 更新不起作用

标签 android sharedpreferences

我知道,这个问题已经在很多线程中得到处理,但我无法弄清楚这个问题。 所以我设置了这样的共享首选项:

SharedPreferences prefs = MainActivity.this.getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putStringSet(spinnerName, myValueSet  );
editor.apply();

我是这样阅读偏好的:

SharedPreferences prefs = MainActivity.this.getPreferences(MODE_PRIVATE);
Set<String> spinnerValuesSet = null;
spinnerValuesSet = prefs.getStringSet(spinnerName,null );

一切正常,除了我的更改在该 Activity 运行时可见,即 - 我显示 SharedPreferences 中的值,允许用户删除或添加然后更新 ListView。这有效,但在我重新启动应用程序后,我得到了初始值。 例如,这是我从列表中删除一个值、更新 SharedPreferences 中的值并更新 ListView 的方法

Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View arg0) {
    SharedPreferences prefs =  MainActivity.this.getPreferences(MODE_PRIVATE);
    Set<String> spinnerValuesSet = prefs.getStringSet(spinnerName,null );
    for (String s : spinnerValuesSet)
    {
         if(s == currentSelectedItemString)
         {
             spinnerValuesSet.remove(s);
             SharedPreferences.Editor editor = prefs.edit();
             editor.putStringSet(spinnerName, spinnerValuesSet );
                 editor.apply();
             break;
         }
    }
 updateListValues();

}
});

这是更新 ListView 的方法:

 private void updateListValues()
 {
   SharedPreferences prefs = MainActivity.this.getPreferences(MODE_PRIVATE);
   Set<String> spinnerValuesSet = prefs.getStringSet(spinnerName,null );
   if(spinnerValuesSet.size() > 0) 
    {
        names = new ArrayList<String>();
        names.clear();
        int k=0;
        for (String s : spinnerValuesSet) {
             names.add(k, s);
             k++;
        }
        namesAA = new ArrayAdapter<String> (  this, android.R.layout.simple_list_item_activated_1, names );
        myList.setAdapter(namesAA);
   }

非常感谢任何帮助。

最佳答案

SharedPreferences 的各种 get 方法返回的对象应该被视为不可变的。参见 SharedPreferences Class Overview供引用。

您必须调用 remove(String)通过 SharedPreferences.EditorSharedPreferences.edit() 返回而不是直接在 SharedPreferences.getStringSet(String, Set<String>) 返回的 Set 上.

您每次都需要构建一个包含更新内容的新字符串集,因为当您想要更新其内容时,您必须从 SharedPreferences 中删除 Set 条目。

关于Android SharedPreferences 更新不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18793903/

相关文章:

java - Android 应用程序架构 - RxJava

java - 从共享首选项中记住上一个数组

java - 任务“:app:compileDebugJavaWithJavac”执行失败

java - 更改 Android Listview ArrayAdapter 中最后一项的布局

java - SharedPreferences 问题 - 丢失上次保存的值

使用 SharedPreferences 的 Android 小部件配置

java - 在 Android 中使用共享首选项传递 Java 对象

java - Android HierarchyViewer 加载时间

java - 无需 READ_PHONE_STATE 权限即可使用 TelephonyManager

android - 如何为各种 android 设备定义图像大小,而不是图标?