点击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。
有人可以建议我在这种情况下应该做什么吗?预先感谢。
答案 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>);