5

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

这些方法没有保存或加载某些东西...... 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);

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

我不知道出了什么问题...

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

...
mContext = this;
...
    public static Context getMContext(){
        return mContext;
    }
4

2 回答 2

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

为共享首选项删除和添加值创建 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();
 }

添加列表的第二种方法

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

我希望这会奏效。

于 2013-07-27T09:15:36.427 回答
1
public static boolean saveArrayList()
{

SharedPreferences sp = SharedPreferences.getDefaultSharedPreferences(this);
SharedPreferences.Editor mEdit1 = sp.edit();
mEdit1.putInt("Status_size", sKey.size()); /* sKey is an array List*/ 

    for(int i=0;i<sKey.size();i++)  
    {
    mEdit1.remove("Status_" + i);
    mEdit1.putString("Status_" + i, sKey.get(i));  
    }

    return mEdit1.commit();     
}

**Loading Array Data from Shared Preferences**

 public static void loadArrayList(Context mContext)
 {  
    Shared Preferences mSharedPreference1 = PreferenceManager.getDefaultSharedPreferences(mContext);
    sKey.clear(); //skey is arraylist
    int size = mSharedPreference1.getInt("Status_size", 0);  

    for(int i=0;i<size;i++) 
    {
      sKey.add(mSharedPreference1.getString("Status_" + i, null)); //skey is arraylist
    }
 }
于 2014-07-07T12:38:54.663 回答