【问题标题】:how to store list of fragments using SharedPreferences如何使用 SharedPreferences 存储片段列表
【发布时间】:2022-01-13 00:55:54
【问题描述】:

我正在使用 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 属性存储自定义对象吗?提前致谢!

【问题讨论】:

    标签: java android android-fragments sharedpreferences


    【解决方案1】:

    Fragments 不是serializable,这意味着它们不能分解为纯数据,即JSON,更不用说deserializable

    查看您的代码也没有好办法让它工作。

    您需要遵循关注点分离,Fragments 是美化的观点。他们不应该在很大程度上持有信息,所以他们不应该像他们那样被传递。

    您可以做的是拥有一个包含Card Fragment 所需的所有信息的CardModel

    CardModel 可以包含您可以在JSON 中找到的简单数据,例如IntegerString 等...

    List&lt;CardModel&gt; 可以是 deserialized 来自 JSON。然后,当您在 MainActivity 中时,您可以根据需要创建尽可能多的 Card Fragments 来表示 List&lt;CardModel&gt;,并使用简单的 list.size()

    【讨论】:

      猜你喜欢
      • 2020-09-13
      • 2014-10-13
      • 1970-01-01
      • 2011-09-29
      • 2023-04-02
      • 2014-05-23
      • 1970-01-01
      相关资源
      最近更新 更多