Android ArrayList<String> 存储未恢复到其保存的排序顺序
Android ArrayList<String> stored not restored back to its saved sorted order
我有一个 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);
有没有更好的方法可以存储 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 的新手,所以不知道它是否是一个好的技巧,如果您找到更好的技巧,请告诉我。
我有一个 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);
有没有更好的方法可以存储 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 的新手,所以不知道它是否是一个好的技巧,如果您找到更好的技巧,请告诉我。