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

Posted

技术标签:

【中文标题】Android ArrayList<String> 存储未恢复到其保存的排序顺序【英文标题】:Android ArrayList<String> stored not restored back to its saved sorted order 【发布时间】:2020-04-06 16:01:15 【问题描述】:

    我有一个 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 的值并恢复到原来保存的排序顺序?

【问题讨论】:

试试这个:***.com/a/45035904/7746134 您无法在 SharedPreferences 中保存对象。您可以将对象转换为字符串,然后将其保存并在获取时将字符串转换为对象。 不可能:“无法在 SharedPreferences 中保存对象”,因为我可以取回数据,但不是按照原始顺序 你可以用gson序列化arrayList之类的字符串 SharedPreferences 将其作为普通的Set 处理,它本质上没有顺序。它不关心你使用什么实现,但即使你使用的是有序的Set,它也不是。 【参考方案1】:

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'

【讨论】:

【参考方案2】:

你可以像字符串一样序列化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;

【讨论】:

convertToArrayList() 如果我传入一个空字符串会中断 当我调用 convertFromArrayList() 时,出现以下错误:(我在 Eclipse 上使用 jar)java.lang.NoClassDefFoundError:解析失败:Lcom/google/gson/Gson; 你需要将Gson lib添加到你的项目repo1.maven.org/maven2/com/google/code/gson/gson/2.8.2 修复了崩溃,因为我使用的是 2.6.2 的副本 当我调用convertFromArrayList(), Gson().toJson(list) 仍然崩溃list 的值为[a1, a2, a3] 没有错误显示。【参考方案3】:

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

只有在你还没有阅读过序列化的时候才阅读这篇文章,否则请继续阅读我的 hack

为了按顺序存储数组项,我们可以将数组序列化为单个字符串(通过创建一个新类 ObjectSerializer (从 - www.androiddevcourse.com/objectserializer.html 复制代码,替换除包名))

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

第 38 行的其余代码 -

将下一个参数设置为这样,这样如果没有检索到数据,它将返回空数组(我们不能放空字符串,因为容器/变量是数组而不是字符串)

来我的 Hack :-

通过在每个项目之间添加一些符号将数组的内容合并为单个字符串,然后在检索时使用该符号将其拆分。 如果您担心拆分,只需查找“在 java 中拆分字符串”。

[注意:如果您的数组的内容是原始类型,如字符串、int、float 等,这可以正常工作。它适用于具有自己结构的复杂数组,假设是电话簿,但是合并和拆分会变得有点复杂。 ]

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

【讨论】:

以上是关于Android ArrayList<String> 存储未恢复到其保存的排序顺序的主要内容,如果未能解决你的问题,请参考以下文章

打印直角三角形

android 怎么将一个类中的arraylist<bitmap>序列化。

从 JSONArray 转换为 ArrayList<CustomObject> - Android

保存并获取 ArrayList<Integer> Android

ArrayList<String> 使用改造 android 解析成 recyclerview

在android中将arraylist <String>值插入sqlite