【问题标题】:ArrayList<Class> sharedpreferencesArrayList<Class> 共享首选项
【发布时间】:2020-05-04 17:46:45
【问题描述】:

有没有办法将 ArrayList 保存到 sharedpreferences 中?谢谢

ArrayList<Class> activityList = new ArrayList<>();
activityList.add(Level1Activity.class);
activityList.add(Level2Activity.class);
activityList.add(Level3Activity.class);
activityList.add(Level4Activity.class);
activityList.add(Level5Activity.class);

【问题讨论】:

    标签: java android arraylist sharedpreferences


    【解决方案1】:

    我已经回答了你的另一个问题,但为了以防万一,我会在这里重写它并解释一下。

    您可以使用Gson 将您的列表转换为Json String,以便将其保存在SharedPreferences 中。

    您需要在应用的 gradle 依赖项中添加 implementation 'com.google.code.gson:gson:2.8.6' 才能使用 Gson

    但是,当您使用Class 类时,您不能简单地将使用Gson 的列表解析为Json,反之亦然。为此,您需要为其创建自己的 serializerdeserializer。否则你会遇到这个异常:

    java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: com.etc.etc.Level1Activity. Forgot to register a type adapter?
    


    所以让我们创建一个实现JsonSerializerJsonDeserializer 的自定义适配器。不要忘记将我们正在使用的类型放在尖括号内,即Class

    ClassAdapter 类

    public class ClassAdapter implements JsonSerializer<Class>, JsonDeserializer<Class> {
    
        @Override
        public JsonElement serialize(Class src, Type typeOfSrc, JsonSerializationContext context) {
            // Get our class 'src' name
            return new JsonPrimitive(src.getName());
        }
    
        @Override
        public Class deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            try {
                // Get class
                return Class.forName(json.getAsString());
            } catch (ClassNotFoundException e) {
                // If class could not be found or did not exists, handle error here...
                e.printStackTrace();
            }
            return null;
        }
    
    }
    

    要将我们的列表转换为Json String 并将其保存在SharedPreferences 中:

    // Create new GsonBuilder and register our adapter for Class objects
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(Class.class, new ClassAdapter());
    
    // Initialize our list of levels (ie. classes)
    List<Class> classes = new ArrayList<>();
    classes.add(Level1Activity.class);
    classes.add(Level2Activity.class);
    classes.add(Level3Activity.class);
    classes.add(Level4Activity.class);
    classes.add(Level5Activity.class);
    
    // Create Gson from GsonBuilder and convert list to json
    Gson gson = gsonBuilder.create();
    String json = gson.toJson(classes);
    
    // Save json to SharedPreferences
    SharedPreferences sharedPreferences = getSharedPreferences("app_name", MODE_PRIVATE);
    sharedPreferences.edit().putString("levels", json).apply();
    

    然后检索列表:

    // Retrieve json from SharedPreferences
    SharedPreferences sharedPreferences = getSharedPreferences("app_name", MODE_PRIVATE);
    String json = sharedPreferences.getString("levels", null);
    
    // Handle here if json doesn't exist yet
    if (json == null) {
        // ...
    }
    
    // Create new GsonBuilder and register our adapter for Class objects
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(Class.class, new ClassAdapter());
    
    // Create Gson from GsonBuilder and specify type of list
    Gson gson = gsonBuilder.create();
    Type type = new TypeToken<ArrayList<Class>>(){}.getType();
    
    // Convert json to list
    List<Class> classes = gson.fromJson(json, type);
    

    希望对您有所帮助,祝您编码愉快!

    【讨论】:

    • 谢谢,我会努力的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2013-07-27
    • 2015-11-29
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    相关资源
    最近更新 更多