如何使用 SharedPreferences 存储片段列表
how to store list of fragments using SharedPreferences
我正在使用 SharedPreferences 来存储我的 android 的片段列表,但是它给了我数千行毫无意义的错误:
2021-12-07 17:09:13.228 14833-14833/? E/AndroidRuntime: 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
在 com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
在 com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:1058)
在......
(只是错误信息的一小部分)
我试图存储一个字符串列表,它工作正常,但如果我切换到一个包含片段列表的对象,它会失败。
这是我的 object.java:
public class CardList {
ArrayList<Card> list; //Card is my fragments
public CardList(ArrayList<Card> list) {
this.list = list;
}
public void updateList(Card c) {
list.add(c);
}
public int getListSize() {
return list.size();
}
}
这是我的 MainActivity.java,这里的新意图只是测试当我回到 MainActivity 时是否可以取回我的数据
public class MainActivity extends AppCompatActivity {
public static final String WEATHER_PREFS = "weatherPrefs";
public CardList cardList;
public ArrayList<Card> cards;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cards = new ArrayList<>();
cardList = new CardList(cards);
SharedPreferences setting = getSharedPreferences(WEATHER_PREFS,MODE_PRIVATE);
Gson gson = new Gson();
String savedList = setting.getString("cardList","");
if (!savedList.equals("")) {
cardList = gson.fromJson(savedList,CardList.class);
}
Button btn= findViewById(R.id.switchActtivity);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
Gson gson = new Gson();
String savedInstanceString = gson.toJson(cardList);
SharedPreferences setting = getSharedPreferences(WEATHER_PREFS,MODE_PRIVATE);
SharedPreferences.Editor editor = setting.edit();
editor.putString("cardList",savedInstanceString);
editor.apply();
startActivity(intent);
}
});
Button increase = findViewById(R.id.increase);
increase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cardList.updateList(Card.newInstance("hello","world"));
Log.i("Array List Size After Click",String.valueOf(cardList.getListSize()));
}
});
}
}
谁能教我如何在 Android 中存储带有 arraylist 属性的自定义对象?提前致谢!
Fragment
不是 serializable
,这意味着它们不能分解为纯数据,即 JSON
,更不用说 deserializable
.
看看你的代码,也没有什么好办法让它工作。
您需要遵循关注点分离,Fragment
是美化的观点。他们不应该在很大程度上持有信息,所以他们不应该像他们那样被传递。
您可以做的是拥有一个 CardModel
,其中包含 Card
Fragment
.
所需的所有信息
CardModel
可以包含您可以在 JSON
中找到的简单数据,例如 Integer
、String
等...
一个List<CardModel>
可以从JSON
变成deserialized
。然后当你在 MainActivity
中时,你可以根据需要创建尽可能多的 Card
Fragment
来用简单的 list.size()
[=30 表示 List<CardModel>
=]
我正在使用 SharedPreferences 来存储我的 android 的片段列表,但是它给了我数千行毫无意义的错误:
2021-12-07 17:09:13.228 14833-14833/? E/AndroidRuntime: 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) 在 com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) 在 com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:1058) 在......
(只是错误信息的一小部分) 我试图存储一个字符串列表,它工作正常,但如果我切换到一个包含片段列表的对象,它会失败。
这是我的 object.java:
public class CardList {
ArrayList<Card> list; //Card is my fragments
public CardList(ArrayList<Card> list) {
this.list = list;
}
public void updateList(Card c) {
list.add(c);
}
public int getListSize() {
return list.size();
}
}
这是我的 MainActivity.java,这里的新意图只是测试当我回到 MainActivity 时是否可以取回我的数据
public class MainActivity extends AppCompatActivity {
public static final String WEATHER_PREFS = "weatherPrefs";
public CardList cardList;
public ArrayList<Card> cards;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cards = new ArrayList<>();
cardList = new CardList(cards);
SharedPreferences setting = getSharedPreferences(WEATHER_PREFS,MODE_PRIVATE);
Gson gson = new Gson();
String savedList = setting.getString("cardList","");
if (!savedList.equals("")) {
cardList = gson.fromJson(savedList,CardList.class);
}
Button btn= findViewById(R.id.switchActtivity);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
Gson gson = new Gson();
String savedInstanceString = gson.toJson(cardList);
SharedPreferences setting = getSharedPreferences(WEATHER_PREFS,MODE_PRIVATE);
SharedPreferences.Editor editor = setting.edit();
editor.putString("cardList",savedInstanceString);
editor.apply();
startActivity(intent);
}
});
Button increase = findViewById(R.id.increase);
increase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cardList.updateList(Card.newInstance("hello","world"));
Log.i("Array List Size After Click",String.valueOf(cardList.getListSize()));
}
});
}
}
谁能教我如何在 Android 中存储带有 arraylist 属性的自定义对象?提前致谢!
Fragment
不是 serializable
,这意味着它们不能分解为纯数据,即 JSON
,更不用说 deserializable
.
看看你的代码,也没有什么好办法让它工作。
您需要遵循关注点分离,Fragment
是美化的观点。他们不应该在很大程度上持有信息,所以他们不应该像他们那样被传递。
您可以做的是拥有一个 CardModel
,其中包含 Card
Fragment
.
CardModel
可以包含您可以在 JSON
中找到的简单数据,例如 Integer
、String
等...
一个List<CardModel>
可以从JSON
变成deserialized
。然后当你在 MainActivity
中时,你可以根据需要创建尽可能多的 Card
Fragment
来用简单的 list.size()
[=30 表示 List<CardModel>
=]