如何保存添加到保存在SharedPreference

时间:2018-12-26 07:12:13

标签: android arraylist sharedpreferences

点击Activity1时,我使用SharedPreferences将一些数据从Activity2传递到button。然后,将这些数据添加到ArrayList中的Activity2

//Basically I have ListView with images. 
//When user ckick on any image, Activity1 opens and it contains this image and it's name

Activity1 {

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           String imageName = intent.getStringExtra("name");   //imageName has different vavues, depends on which image user clicked in previous activity.
           int imageId = intent.getIntExtra("image", 0);   //imageId has different vavues, depends on which image user clicked in previous activity.
           String str = Integer.toString(imageId);   //convert imageId to use it as a key in SharedPreferences
           SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("MyPref", Context.MODE_PRIVATE);
           SharedPreferences.Editor editor = sharedPref.edit();

           editor.putString("key", str);  //save current key, 
           editor.putInt(str, receivedImage);
           editor.putString(str + "a", receivedName);
           editor.apply();
    }
}

Activity2{

   onCreate{
      SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("MyPref", Context.MODE_PRIVATE);
      String key1 = sharedPref.getString("key", null);
      String imageName = sharedPref.getString(key1 + "a", null);
      int imageId = sharedPref.getInt(key1, 0);
      mDrinkArrayList.add(new Drink(imageName, imageId));

      listAdapter = new CustomAdapter(this, mDrinkArrayList);
      listAdapter.notifyDataSetChanged();
      ListView listDrinks = findViewById(R.id.list_drinks);
      listDrinks.setAdapter(listAdapter);
   }
}

问题是mArrayList无法保存之前添加的Data。例如,我单击了3张不同图像中的button,并且我期望mArrayList将具有3个Data对象。但是实际上,它始终只有最后一个Data对象。 我知道为什么会发生-SharedPreferences会覆盖旧数据。我看到很多建议,例如我必须使用不同的键,但是我做到了(将imageResourseId用作键)。我考虑了解决这个问题的方法。我现在可以理解的方式是:

1)以某种方式让SharedPreferences存储以前的数据(我听说过使用SQL数据库,但是我没有太多图像可以使用数据库)。

2)在接收到新数据后覆盖mDrinkArrayList,因此当Activity2再次启动时,它基本上具有旧数据。

3)在Activity1中创建mDrinkArrayList,单击按钮时添加新数据,然后使用SharedPreference将mDrinkArrayList传递给Activity2。

有人可以建议我在这种情况下应该做什么吗?预先感谢。

3 个答案:

答案 0 :(得分:0)

您可以使用TinyDB进行此操作。

要保存列表,请创建一个对象并将数据保存到您的 activity1

TinyDB tinydb = new TinyDB(context);

tinydb.putList("key", yourIdList));

并从 activity2

获取数据
TinyDB tinydb = new TinyDB(context);

tinydb.getList("key");

答案 1 :(得分:0)

我认为将整个arraylist传递到另一个活动而不是传输数据并在目标中进行转换是一个更好的解决方案。 您可以使用序列化数据添加Intent并在第二个活动中对其进行回调。 如果您需要更多信息,请告诉我。

答案 2 :(得分:0)

您需要Serialized的{​​{1}}类,如下所示:-

Bean

在您的 Activity1 中,您需要像下面这样通过public class YOUR_BEAN_CLASS implements Serializable{ } Bean,然后通过

Pojo

与第二类 Activity2 相比,您会获得“ YOUR_ARRAYLIST”,如下所示:

  startActivity(new Intent(mContext,
  SECOND_ACTIVITY.class).putExtra("YOUR_BEAN", (Serializable) 
  new ArrayList<YOUR_BEAN_CLASS>);