Как сохранить данные, добавленные в массив, сохраненный в SharedPreference - PullRequest
0 голосов
/ 26 декабря 2018

Я использую SharedPreferences для передачи некоторых данных от Activity1 до 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, добавленное ранее.Например, я нажимаю на button из 3 разных изображений и ожидаю, что mArrayList будет иметь 3 Data объектов.Но на самом деле он всегда имеет только последний Data объект.Я понимаю, почему это происходит - SharedPreferences отменяет старые данные.Я видел много советов, как я должен использовать разные ключи, но я сделал это (поместите imageResourseId в качестве ключа).Я думал о способах решения этой проблемы.Теперь я могу понять следующие способы:

1) каким-то образом позволить SharedPreferences сохранять предыдущие данные (я слышал об использовании базы данных SQL, но у меня не так много изображений для использования базы данных).

2) переопределить mDrinkArrayList после получения новых данных, поэтому при повторном запуске Activity2 у него в основном старые данные.

3) создать mDrinkArrayList в Activity1, добавить новые данные при нажатии кнопки и передать mDrinkArrayList в Activity2, используя SharedPreference.

Может кто-нибудь подсказать, что мне делать в этой ситуации?Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Я думаю, что это лучшее решение для передачи всего массива в другой вид деятельности вместо передачи данных и преобразования в место назначения.Вы можете использовать Сериализуемые данные, чтобы добавить Намерение и отозвать его во втором действии.Если вам нужна дополнительная информация об этом, дайте мне знать.

0 голосов
/ 26 декабря 2018

Вам нужно Serialized ваш Bean класс, как показано ниже: -

public class YOUR_BEAN_CLASS implements Serializable{


}

И чем после в вашей Activity1 вам нужно просто пройти, ваш Bean ИЛИPojo как показано ниже

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

И чем во втором классе Activity2 Вы получите "YOUR_ARRAYLIST", как следует

ArrayList<YOUR_BEAN_CLASS> categoryList = (ArrayList<YOUR_BEAN_CLASS>)getIntent().getSerializableExtra("category");
0 голосов
/ 26 декабря 2018

Вы можете использовать TinyDB для этого подхода.

Для сохранения списка создайте объект и сохраните данные в вашей Activity1

TinyDB tinydb = new TinyDB(context);

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

И получите ваши данные от активность2

TinyDB tinydb = new TinyDB(context);

tinydb.getList("key");
...