#java #android #android-fragments #sharedpreferences
#Ява #Android #android-фрагменты #общие рекомендации
Вопрос:
Я использую SharedPreferences для хранения списка фрагментов моего Android, однако это дало мне тысячи строк ошибок, которые не имеют смысла:
2021-12-07 17:09:13.228 14833-14833/? E/AndroidRuntime: по адресу com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Адаптер.запись(ReflectiveTypeAdapterFactory.java:245) в com.google.gson.внутренняя привязка.TypeAdapterRuntimeTypeWrapper.напишите(TypeAdapterRuntimeTypeWrapper.java:69) по адресу com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.напишите(ReflectiveTypeAdapterFactory.java:127) в com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Адаптер.запись(ReflectiveTypeAdapterFactory.java:245) в com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:1058) по адресу …….
(только небольшие части сообщений об ошибках) Я попытался сохранить список строк, он работает нормально, но если я переключусь на объект со списком фрагментов, это не удастся.
Вот мой object.java:
public class CardList { ArrayListlt;Cardgt; list; //Card is my fragments public CardList(ArrayListlt;Cardgt; list) { this.list = list; } public void updateList(Card c) { list.add(c); } public int getListSize() { return list.size(); } }
вот мой MainActivity.java, новое намерение здесь состояло в том, чтобы просто проверить, смогу ли я вернуть свои данные, когда вернусь к основной активности
public class MainActivity extends AppCompatActivity { public static final String WEATHER_PREFS = "weatherPrefs"; public CardList cardList; public ArrayListlt;Cardgt; cards; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cards = new ArrayListlt;gt;(); 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())); } }); } }
Может ли кто-нибудь научить меня, как хранить пользовательский объект с атрибутом arraylist в Android? Заранее спасибо!
Ответ №1:
Fragment
s не serializable
являются , что означает , что они не могут быть разбиты на чистые данные, т. Е. JSON
, тем более deserializable
.
Глядя на ваш код, тоже нет хорошего способа просто заставить его работать.
Вам нужно следовать разделению забот, Fragment
это прославленные взгляды. Они не должны в значительной степени хранить информацию, поэтому их не следует передавать так, как если бы они это делали.
Что вы могли бы сделать, так это иметь a CardModel
, который содержит всю информацию, необходимую для a Card
Fragment
.
Они CardModel
могут содержать простые данные, которые вы найдете в JSON
разделе «Нравится Integer
« String
, и т. Д…
А Listlt;CardModelgt;
может быть deserialized
от JSON
. А затем, когда вы находитесь в MainActivity
, вы можете создать столько Card
Fragment
s, сколько необходимо, чтобы представить Listlt;CardModelgt;
с помощью простого list.size()