在共享首选项中保存ArrayList

Bol*_*lic 5 android android-preferences

我正在寻找几个小时来找出为什么在共享首选项中保存布尔列表不起作用.

方法不保存或加载某些东西...... loadmethod总是返回替代值:所以list_size为0,布尔值为false.

首先,我在MainActivity中创建列表并调用save方法:

SaveLoadTraining sLoad = new SaveLoadTraining();
    ArrayList<Boolean> listBoolTrain = new ArrayList<Boolean>();
    listBoolTrain.add(true);
    listBoolTrain.add(true);
    sLoad.saveArray(listBoolTrain);
Run Code Online (Sandbox Code Playgroud)

子类SaveLoadTraining看起来像这样:

    package de.sebspr.app08.halle;

import java.util.ArrayList;

import android.content.Context;
import android.content.SharedPreferences;
import de.sebspr.app08.MainActivity;

public class SaveLoadTraining {

    private Context context;
    public static final String PREFS_NAME = "ListFile";
    private ArrayList<Boolean> list;

    public SaveLoadTraining(){
        this.context = MainActivity.getMContext();
    }

    public void saveArray(ArrayList<Boolean> list){

        this.list = list;

        SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
        SharedPreferences.Editor editor = settings.edit();

        int size = list.size();
        editor.putInt("list_size", size);

        for (int i = 0; i < size; i++) {
            editor.remove("list_"+i);
        }
        for (int i = 0; i < size; i++) {
            editor.putBoolean("list_"+i, list.get(i));
        }       
        editor.commit();
    }

    public ArrayList<Boolean> loadArray(){

        SharedPreferences file = context.getSharedPreferences(PREFS_NAME, 0);
        list = new ArrayList<Boolean>();
        int size = file.getInt("list_size", 0);

        for(int i = 0; i<size;i++){
            boolean bool = file.getBoolean("list_"+i, false);
            list.add(bool);
        }
        return list;
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚出了什么问题......

也许我以错误的方式处理上下文?我只是调用此方法来获取MainActivity的上下文:

...
mContext = this;
...
    public static Context getMContext(){
        return mContext;
    }
Run Code Online (Sandbox Code Playgroud)

Sal*_*ani 3

只需在代码中进行以下更改,它就应该可以工作。作为SharedPrefrences mSharedPrefs你的类变量。

public class SaveLoadTraining 
{
private Context context;
public static final String PREFS_NAME = "ListFile";
private ArrayList<Boolean> list;   
private SharedPreferences mSharedPrefs;

public SaveLoadTraining(){
    this.context = getApplicationContext();
    mSharedPrefs = context.getSharedPreferences(PREFS_NAME, 0);
}
Run Code Online (Sandbox Code Playgroud)

创建 2 种不同的方法来删除和添加值到共享首选项,并在两次提交中完成,而不是 1 次提交。

第一种删除列表的方法

public void removeArray(ArrayList<Boolean> list)
{
SharedPreferences.Editor editor = mSharedPrefs.edit();

int size = list.size();

    for (int i = 0; i < size; i++) {
        editor.remove("list_"+i);
    }
    editor.commit();
 }
Run Code Online (Sandbox Code Playgroud)

添加列表的第二种方法

public void addArray(ArrayList<Boolean> list)
{
SharedPreferences.Editor editor = mSharedPrefs.edit();

    int size = list.size();
    editor.putInt("list_size", size);

    for (int i = 0; i < size; i++) {
        editor.putBoolean("list_"+i, list.get(i));
    }       
    editor.commit();
 }
Run Code Online (Sandbox Code Playgroud)

我希望这会起作用。