0

我想在检查切换按钮时保存两个字符串值,并从另一个Fragment检索它。这是我所做的按钮OnClickListener,但它不工作:如何使用SharedPreference存储字符串数组?

holder.favButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 
    @Override 
    public void onCheckedChanged(CompoundButton favButton, boolean isChecked){ 
     if (isChecked) 
      favButton.setBackgroundDrawable(ContextCompat.getDrawable(favButton.getContext(),R.mipmap.ic_launcher)); 
     PreferenceManager.getDefaultSharedPreferences(context).edit().putString("PRODUCT_APP", "Product_Favorite").commit(); 

     else 
      favButton.setBackgroundDrawable(ContextCompat.getDrawable(favButton.getContext(), R.mipmap.ic_cart)); 
    } 
}); 

这是我SharedPreference

public class SharedPreference { 

    public static final String PREFS_NAME = "PRODUCT_APP"; 
    public static final String FAVORITES = "Product_Favorite"; 

    public SharedPreference() { 
     super(); 
    } 

    // This four methods are used for maintaining favorites. 
    public void saveFavorites(Context context, List<CardItemModel> favorites) { 
     SharedPreferences settings; 
     SharedPreferences.Editor editor; 

     settings = context.getSharedPreferences(PREFS_NAME, 
       Context.MODE_PRIVATE); 
     editor = settings.edit(); 

     Gson gson = new Gson(); 
     String jsonFavorites = gson.toJson(favorites); 

     editor.putString(FAVORITES, jsonFavorites); 

     editor.commit(); 
    } 

    public void addFavorite(Context context, CardItemModel product) { 
     List<CardItemModel> favorites = getFavorites(context); 
     if (favorites == null) 
      favorites = new ArrayList<CardItemModel>(); 
     favorites.add(product); 
     saveFavorites(context, favorites); 
    } 

    public void removeFavorite(Context context, CardItemModel product) { 
     ArrayList<CardItemModel> favorites = getFavorites(context); 
     if (favorites != null) { 
      favorites.remove(product); 
      saveFavorites(context, favorites); 
     } 
    } 

    public ArrayList<CardItemModel> getFavorites(Context context) { 
     SharedPreferences settings; 
     List<CardItemModel> favorites; 

     settings = context.getSharedPreferences(PREFS_NAME, 
       Context.MODE_PRIVATE); 

     if (settings.contains(FAVORITES)) { 
      String jsonFavorites = settings.getString(FAVORITES, null); 
      Gson gson = new Gson(); 
      CardItemModel[] favoriteItems = gson.fromJson(jsonFavorites, 
        CardItemModel[].class); 

      favorites = Arrays.asList(favoriteItems); 
      favorites = new ArrayList<CardItemModel>(favorites); 
     } else 
      return null; 

     return (ArrayList<CardItemModel>) favorites; 
    } 
} 
+0

此链接可能很有用:http://stackoverflow.com/questions/7057845/save-arraylist-to-sharedpreferences – Koorosh

+0

你的'setOnCheckedChangeListener'不应该工作。没有相应的最后一部分。请先修复您的代码,然后再次发布代码。它应该给你一个编译错误。 –

回答

2

让我们来解决这个问题^^。 您可以通过在单个字符串中添加多个收藏夹来保存多个收藏夹,每个收藏夹项以逗号分隔。然后您可以使用convertStringToArray方法将其转换为字符串数组。这里是完整的源代码。 使用MyUtility方法保存多个收藏夹项目。

MyUtility.addFavoriteItem(this, "Sports"); 
     MyUtility.addFavoriteItem(this, "Entertainment"); 

得到所有收藏的字符串数组保存

String[] favorites = MyUtility.getFavoriteList(this);// returns {"Sports","Entertainment"}; 

在单独的实用工具类

public abstract class MyUtility { 

public static boolean addFavoriteItem(Activity activity,String favoriteItem){ 
    //Get previous favorite items 
    String favoriteList = getStringFromPreferences(activity,null,"favorites"); 
    // Append new Favorite item 
    if(favoriteList!=null){ 
     favoriteList = favoriteList+","+favoriteItem; 
    }else{ 
     favoriteList = favoriteItem; 
    } 
    // Save in Shared Preferences 
    return putStringInPreferences(activity,favoriteList,"favorites"); 
} 
public static String[] getFavoriteList(Activity activity){ 
    String favoriteList = getStringFromPreferences(activity,null,"favorites"); 
    return convertStringToArray(favoriteList); 
} 
private static boolean putStringInPreferences(Activity activity,String nick,String key){ 
    SharedPreferences sharedPreferences = activity.getPreferences(Activity.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putString(key, nick); 
    editor.commit();       
    return true;   
} 
private static String getStringFromPreferences(Activity activity,String defaultValue,String key){ 
    SharedPreferences sharedPreferences = activity.getPreferences(Activity.MODE_PRIVATE); 
    String temp = sharedPreferences.getString(key, defaultValue); 
    return temp;   
} 

private static String[] convertStringToArray(String str){ 
    String[] arr = str.split(","); 
    return arr; 
} 

}

保存这些方法如果你有添加额外的收藏夹。然后从SharedPreference得到最喜欢的字符串,并附加逗号+最喜欢的项目,并将其保存回SharedPreference。 *您可以使用任何其他字符串作为分隔符而不是逗号。