【问题标题】:Save ArrayList in shared preferences将 ArrayList 保存在共享首选项中
【发布时间】:2013-07-27 13:57:17
【问题描述】:

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

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

【问题讨论】:

  • I can not figure out what is going wrong... - 我们也不能,因为你还没有告诉我们 ;)
  • ehm, hehe ;) 这些方法没有保存或加载某些东西...... loadmethod 总是返回替代值:所以 list_size 为 0,布尔值为 false
  • 我刚刚复制了你的代码,它对我有用。请说明您加载和保存它的位置或测试方式。
  • 我刚刚发现了问题所在。我发布的上面的代码就是你所说的正确......错误在其他地方......

标签: android android-preferences


【解决方案1】:

只需在您的代码中进行以下更改,它应该可以工作。 将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();
 }

我希望这会奏效。

【讨论】:

  • 我发现了错误。它在我的代码中的其他地方。所以代码工作正常,就像我发布的那样。永远...谢谢 ;-)
  • @Bolic 没问题的伙伴 :)
  • @SalmanAyub 我想在共享首选项中保存/存储列表 我该怎么做?我不想保存列表字符串我想在 SharedPreferences 中存储完整的 arrayList
  • bdw 如何从另一个活动中获取值并让我检查它是否可以工作:P
【解决方案2】:
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
    }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多