как сохранить список фрагментов с помощью общих ссылок

#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()