【问题标题】:How to save HashMap<String, Parcelable> to file?如何将 HashMap<String, Parcelable> 保存到文件中?
【发布时间】:2015-12-08 07:47:04
【问题描述】:

对不起,我的英语不好。

我有一个HashMap&lt;String, Parcelable&gt; 来保存RecyclerView 的一些InstanceStates,我想将HashMap&lt;String, Parcelable&gt; 保存到一个文件中。

我使用ObjectOutputStream,它可以写入文件,但是当我使用ObjectInputStream时,它似乎没有读取一些有用的数据,因为RecyclerView的状态没有改变到已经保存的状态。

为什么这不起作用?

如何保存和恢复 "key-value" 的 InstanceState 视图????

我想保存InstanceState永久。

谢谢你的帮助~

我的代码:

private HashMap <String, Parcelable> hmRecyclerViewState = new HashMap<String, Parcelable>();    
private Parcelable recyclerViewState;
ObjectOutputStream oos;
ObjectInputStream ois;

1.

    try {
        ois = new ObjectInputStream(new FileInputStream(stateFile));
        hmRecyclerViewState = (HashMap<String, Parcelable>)ois.readObject();
    } catch (StreamCorruptedException e) {
        e.printStackTrace();
    } catch (OptionalDataException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {  
        if (ois != null) {  
            try {  
                ois.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }
    }

2.

    try {
        oos = new ObjectOutputStream(new FileOutputStream(stateFile));
        if (hmRecyclerViewState != null)
            oos.writeObject(hmRecyclerViewState);
        oos.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {  
        try {  
            if (oos != null)  
                oos.close();  
        } catch (IOException ex) {  
            ex.printStackTrace();  
        }  
    }  

3.

public void saveRecyclerViewState(String tableName) {
    recyclerViewState = recyclerView.getLayoutManager().onSaveInstanceState();
    hmRecyclerViewState.put(tableName, recyclerViewState);
}

4.

public void restoreRecyclerViewState(String tableName) {
    if ( hmRecyclerViewState.get(tableName) != null) {
        recyclerViewState = hmRecyclerViewState.get(tableName);
        recyclerView.getLayoutManager().onRestoreInstanceState(recyclerViewState);
        recyclerViewState = null;
    }
}

【问题讨论】:

  • 您可以对其进行迭代并将其保存为文件...
  • @sourabhbans 谢谢。但是“迭代它”是什么意思?你能显示一些代码吗?

标签: android parcelable objectoutputstream instancestate


【解决方案1】:

您可以将 Parcelable objects 保存为 String 或 XML 或 JSON 类型。然后您可以将它们保存到文件中。顺便说一句,HashMap 对象实现了 Serializable,因此您可以毫无问题地将 HashMap 对象保存到文件中。

有一些关于PARCELABLE VS. JAVA SERIALIZATION IN ANDROID APP DEVELOPMENT的信息

【讨论】:

  • 谢谢,但我不明白如何将 Parcelable 对象保存到字符串?我将 instancestate 保存在 Parcelable 对象中。你能显示一些代码吗?非常感谢
【解决方案2】:

如果我关注了你的问题,那么你可以做类似的事情...... 遍历您的地图>>放入字符串构建器>>将其保存到文件中。 在您的情况下,在您的 parcelable 类中创建一个 toString() 方法,该方法以逗号分隔的格式返回所有字段,如 (id,name,address...)。

StringBuilder sb = new StringBuilder();
for (Map.Entry<String, Parcelable> entry : map.entrySet()) {
    String key = entry.getKey();
    Parcelable value = entry.getValue();
   // append it to String builder
    sb.append(key+":"value.toString()+"\n");
}
// write here to a file..

当你想从文件中恢复读取>>把它放入地图>>恢复它。

【讨论】:

  • 当我恢复它时,如何将value.toString()转移到Parcelable对象?对不起,我是新人。
  • 您可以使用 bean 类的 setter 方法将值设置为对象。
  • 这个对象不是我自定义的,它来自recyclerView.getLayoutManager().onSaveInstanceState(),它返回一个Parcelable对象,我打开源代码,它是一个接口。我不知道怎么办?
猜你喜欢
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 2013-05-12
  • 2013-10-04
  • 2014-06-25
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多