如何在共享首选项中存储字符串数组(从数组列表<string>转换为字符串数组)。

时间:2015-06-18 07:34:08

标签: android arrays arraylist sharedpreferences onactivityresult

我有两项活动。我将数组列表从第二个活动传递到第一个活动。在第一个活动中将数组列表转换为字符串数组现在我想用共享偏好保存这个字符串数组,但我不能这样做。

传递数组列表的第二个活动代码

                Intent i = new Intent();
                //Bundle extra = new Bundle();
                //i.putStringArrayList("array",h);
                i.putStringArrayListExtra("array", h);
                //i.putExtras(extra);
                setResult(RESULT_OK,i);
                finish();

获得此结果的第一个活动代码

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{

if(requestCode == 1){

    if(resultCode == RESULT_OK){

    //  Toast.makeText(getApplicationContext(), "success", Toast.LENGTH_SHORT).show();
        File imgFile = null;
        Bundle extras = data.getExtras();

        a= extras.getStringArrayList("array");
        try{
        al = new String[a.size()];
        al = a.toArray(al);

        //for(String ss : al)             
              for(int i = 0; i < al.length; i++){
                  imagepathb.append(al[i]).append(",");

              } 
         }
         sharedpreferences.edit().putString("imgpath",imagepathb.tostring()).commit();                            catch(Exception e){

                  }

        if(ab != null){
            ab =  sharedpreferences.getString("imgpath", ab);
          Toast.makeText(getApplicationContext(), "This is ab image path : "+ ab, Toast.LENGTH_LONG).show();    
        }else{
            Toast.makeText(getApplicationContext(), "This is null", Toast.LENGTH_LONG).show();              
        }


    }

   }
}

我使用此代码时遇到了麻烦,因为当我尝试使用此代码时,执行仅针对第一种语法启动,其他两种语法保持原样并且Toast显示空值。共享首选项也无法保存String-Builder变量imagepathb的值。

  for(int i = 0; i < al.length; i++){

     imagepathb.append(al[i]).append(",");
     Toast.makeText(getApplicationContext(), "This is image path : "+ imagepathb, Toast.LENGTH_LONG).show();        
     sharedpreferences.edit().putString("imgpath",imagepathb.tostring()).commit();                    

  } 

我希望在onActivityResult收到结果时将此字符串数组存储在共享首选项中。但我不知道loop中多种语法的工作原理。 任何人都可以为我共享这个字符串数组。提前谢谢你。

2 个答案:

答案 0 :(得分:1)

首先,如果已知ArrayList中的所有字符串都是唯一的(即没有重复项),您可以将 ArrayList 转换为 Set 并使用它来存储它 putStringSet()方法:

sharedpreferences.edit().putStringSet("imgpath", new HashSet<String>(a)).commit();

加载时,您可以将其转换回 ArrayList

ArrayList<String> myList = 
      new ArrayList<>(sharedpreferences.getStringSet("imgpath", new HashSet<String>()));

另一种方法是存储具有不同名称的多个值:

Edit edit = sharedpreferences.edit();
int cnt = 0;
for (String s : a) 
   edit.putString("imgpath_" + (cnt++), s);
while (sharedpreferences.getString("imgpath_" + cnt, null) != null) {
  edit.remove("imgpath_" + cnt); // delete all extra values from previous save time;
  cnt++;
}
edit.commit();

加载时你必须检查,直到你得到一个空值;

ArrayList<String> a = new ArrayList<>();
for(int cnt = 0;; cnt++) {
   String s = sharedpreferences.getString("imgpath_" + cnt, null);
   if (s == null) break;
   a.add(s);
}

最后,你可以用逗号分隔存储:

StringBuilder sb = new StringBuilder();
for (String s : a) {
    is (sb.length() > 0) sb.append(',');
   sb.append(s);
}
sharedpreferences.edit().putString("imgpath",sb.tostring()).commit();                    

加载时,可以使用String.split来获取数组

String[] al = sharedPreferences.getString("imgpath", "").split(',');

答案 1 :(得分:0)

我认为最好的方法是将它保存在数据库中,共享首选项可以很好地保存用户conexion(用户,密码,...),初始变量等变量...但是没有保存数组列表,它是不是一个好的编程习惯!我也知道你不能将数组列表保存为数组列表但如果作为集合,你可以看到这个post

告诉我,如果我帮助你并做好编程!