【问题标题】:Adding an item to arralist which is already saved in shared preferences in android将一个项目添加到已保存在 android 的 sharedpreferences 中的 arraylist
【发布时间】:2016-07-18 09:58:42
【问题描述】:

我有一个已存储在共享首选项中的数组列表。我想在数组列表中添加另一个项目。 每当我尝试在数组列表中添加一个项目时,它都会删除存储在数组列表中的所有先前数据

如何在不删除共享首选项中以前的数据的情况下添加项目

ArrayList<String> cartArrayListID,cartArrayListName,cartArrayListPrice,cartArrayListImage;
    String cartID,cartName,cartPrice,cartImage;
cartArrayListID=new ArrayList<>();
        cartArrayListName=new ArrayList<>();
        cartArrayListPrice=new ArrayList<>();
        cartArrayListImage=new ArrayList<>();
cartArrayListID.add(cartID);
                cartArrayListName.add(cartName);
                cartArrayListPrice.add(cartPrice);
                cartArrayListImage.add(cartImage);
SharedPreferences sprefCart=getSharedPreferences("CARTINFO", Context.MODE_PRIVATE);
                SharedPreferences.Editor editorCart=sprefCart.edit();
                Gson gson = new Gson();
                String id_=gson.toJson(cartArrayListID);
                String name_=gson.toJson(cartArrayListName);
                String price_=gson.toJson(cartArrayListPrice);
                String image_=gson.toJson(cartArrayListImage);
                editorCart.putString("ID", id_);
                editorCart.putString("NAME", name_);
                editorCart.putString("PRICE", price_);
                editorCart.putString("IMAGE", image_);
                editorCart.apply();
                Toast.makeText(ProductActivity.this, "Added to cart", Toast.LENGTH_SHORT).show();

【问题讨论】:

  • 发布您的代码....
  • 您必须发布您的代码以便我们为您提供帮助,我认为您不会从 SharedPreferences 中检索任何内容,因此每次添加项目时它都会创建一个新列表。
  • @MuhammedRefaat 正在检索数据,但每当我将另一个数据添加到 arraylist 并将其保存到共享首选项时,先前的数据将被删除,即它不是将数据添加到现有的 arraylist,而是将其替换为以前的数据

标签: android arraylist sharedpreferences


【解决方案1】:

正如我在您的代码中看到的那样,您每次都创建一个全新的 ArrayLists cartArrayListIDcartArrayListName、..etc,然后将新值放入其中,然后将其保存在 SharedPreferences 中用新的替换保存在其中的旧的,因此您必须:

  1. 首先从Shared首选项中获取对应的ArrayList(例如cartArrayListName
  2. 将其保存在名为 cartArrayListID 的新数组中。
  3. 将新值放入这个新数组中。
  4. 将其保存回 SharedPreferences。

【讨论】:

    【解决方案2】:

    实现此目的的最佳方法是将数组存储为 JSON 格式的字符串。您必须创建一个简单的 POJO 来存储您的数组,其余的很简单。请参阅下面的示例;

    public void saveArray(List<String> yourArray) {
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString("YOUR_ARRAY_KEY", new Gson().toJson(new ArrayListHolder(yourArray)));
            editor.apply();
        }
    
    public List<String> getArray() {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        String arrayJson = sharedPreferences.getString("YOUR_ARRAY_KEY", null);
        if (arrayJson != null) {
            return new Gson().fromJson(arrayJson, ArrayListHolder.class).getYourArray();
        }
        return null;
    }
    
    private class ArrayListHolder {
        private List<String> yourArray;
    
        public ArrayListHolder(List<String> yourArray) {
            this.yourArray = yourArray;
        }
    
        public List<String> getYourArray() {
            return yourArray;
        }
    
        public void setYourArray(List<String> yourArray) {
            this.yourArray = yourArray;
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用GSON从字符串中获取ArrayList。
      添加一些项目。
      尝试this 示例将ArrayList 保存为String,这样您就可以存储到SharedPreferences。


      如果您的 ArrayList 有一些特殊类型(不是字符串),请使用以下构造:

      ArrayList<Foo> list = new Gson().fromJson(
              gsonString, new TypeToken<List<Foo>>(){}.getType());
      

      【讨论】:

      • 是的@Vlamdimir 我正在保存并从 GSON 获取数组列表,它也工作正常。但是当我添加另一个数据时,它会替换为以前的数据项,即数据总是保存在索引处数组列表 0
      【解决方案4】:

      您无法从SharedPreferences 获得ArrayList

      您可以使用getStringSet 获得Set。请注意,jdoc 声明

      请注意,您不得修改此调用返回的集合实例。

      所以做类似的事情:

      Set<String> mySet = new HashSet(yourPrefDataCollection);
      mySet.add("some string");
      
      
      sp.edit().putStringSet("your set key", mySet).commit();
      

      【讨论】:

      • 我在 Gson 类和 toJson 方法的帮助下将数组列表保存在共享首选项中
      • 在添加和保存时添加代码。另外我建议您使用我的方法..如果您不需要订购它会更有效
      • 我上面提到的用于添加和保存的代码。它工作正常,但问题是数据总是保存在数组列表的索引 0 处。我的意思是每当我将数据添加到数组列表和将其保存到共享首选项以前的数据将被新的替换
      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2013-02-19
      • 1970-01-01
      • 2019-05-09
      相关资源
      最近更新 更多