Android ArrayList<String> 存储未恢复到其保存的排序顺序

Android ArrayList<String> stored not restored back to its saved sorted order

  1. 我有一个 myArrayList,它将按照其保存的排序顺序进行存储和恢复。但是代码不会那样做。为什么?

    ArrayList<String> myArrayList
    
    // save:
            SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(getBaseContext());
    SharedPreferences.Editor edit;
    edit = prefs.edit();
    edit.putStringSet("mydata", new LinkedHashSet<String>(myArrayList));
    edit.commit();
    
        // read:
    myArrayList = new ArrayList<String>(PreferenceManager
            .getDefaultSharedPreferences(getBaseContext()).getStringSet(
                    "mydata", new LinkedHashSet<String>()));
    adapterAppList = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, android.R.id.text1,
            myArrayList);
    
  2. 有没有更好的方法可以存储 myArrayList 的值并恢复到其原始保存的排序顺序?

您可以像字符串一样序列化 arrayList:

1 与 gson

public ArrayList<String> convertToArrayList(String json) {
    if (TextUtils.isEmpty(json)){
        return null; // or new ArrayList<>()
    }
    Type type = new TypeToken<ArrayList<String>>(){}.getType();
    return new Gson().fromJson(json, type);
}
public String convertFromArrayList(ArrayList<String> list) {
    if (list == null){
        return null;
    }
    return new Gson().toJson(list);
}

2 没有 gson

public ArrayList<String> convertToArrayList(String st) {
    if (!TextUtils.isEmpty(st)){
        String[] str = st.split(",");
        if (str.length > 0){
            return new ArrayList<>(Arrays.asList(str));
        }
    }
    return null;
}
public String convertFromArrayList(ArrayList<String> list) {
    if (list!=null && !list.isEmpty()){
        return TextUtils.join(",", list);
    }
    return null;
}

HashSet 不保持顺序,它是为了最快找到它而排序。
您可以将列表转换为 json 并另存为字符串。
当你需要它时,你可以将它从 json 转换为 ArrayList 并保持排序。
示例:

String listAsString = new Gson().toJson(arrayList); //list to string
List<String> arrayList = Arrays.asList(new Gson().fromJson(listAsString,String[].class)) //string to list

不要忘记将库添加到 build.gradle:

dependencies {
  implementation 'com.google.code.gson:gson:2.8.6'
}

是的,你是对的,顺序没有存储在字符串集中,因为它是一个集合(duh)。 当我遇到这个问题时,我得到了序列化解决方案,您可以在其中序列化您的字符串。

如果您还没有阅读过序列化,请阅读此内容,否则请阅读我的 hack

为了按顺序存储数组项,我们可以将数组序列化为单个字符串(通过制作一个新的 class ObjectSerializer(从 – www.androiddevcourse 复制代码.com/objectserializer.html , 替换包名以外的所有内容))

正在共享首选项中输入数据:

第38行的剩余代码-

将下一个 arg 如此放置,这样如果未检索到数据,它将 return 为空数组(我们不能放置空字符串,因为 container/variable 不是一个数组字符串)

来到我的 Hack :-

通过在每个项目之间放置一些符号将数组的内容合并为一个字符串,然后在检索它时使用该符号拆分它。 如果您担心拆分,请查看 "splitting a string in java".

[注意:如果你的数组的内容是原始类型,如字符串、整数、浮点数等,这很好用。它适用于具有自己结构的复杂数组,假设一本 phone 书, 但合并和拆分会变得有点复杂。 ]

PS:我是 android 的新手,所以不知道它是否是一个好的技巧,如果您找到更好的技巧,请告诉我。