保存Arraylist <hashmap>以便在旋转后显示</hashmap>

时间:2012-09-19 18:14:09

标签: android arraylist hashmap

我可以将ArrayList<HashMap<String, String>>保留在捆绑包中吗?

我希望在旋转屏幕后立即显示ListView

2 个答案:

答案 0 :(得分:3)

您无需将其保存在Bundle中。事实上,这似乎是存储在Bundle中的大量信息。

由于您只是保存HashMap Stringstatic个对象,因此您可以创建一个类来为您缓存它或使其成为类中的Activity字段。

静态字段可以使用,只要它们不包含对ViewDrawableprivate static HashMap<String,String> myMap = new HashMap<String,String>(); 的引用即可。 (这可能导致内存泄漏)

最简单的方法可能就是:

static

由于此字段为{{1}},因此在重新创建活动时不会重新创建该字段。相反,它仍然可以使用相同的值。


更多存储数据的方式:

(这些技术也适用于通过配置更改共享数据)。

http://developer.android.com/guide/faq/framework.html#3

  

如何在单个应用程序中的活动/服务之间传递数据?

     

这取决于您要共享的数据类型:

     

原始数据类型

     

在应用程序中的活动/服务之间共享原始数据,   使用Intent.putExtras()。用于传递需要的原始数据   坚持使用首选项存储机制。

     

非持久对象

     

简而言之,用于共享复杂的非持久性用户定义对象   持续时间,建议采用以下方法:

     

单身人士课程

     

您可以利用您的应用程序组件这一事实   通过使用单身人士在同一过程中运行。这是一个   设计为只有一个实例的类。它有静电   返回实例的getInstance()等名称的方法;   第一次调用此方法时,它会创建全局实例。   因为所有调用者都获得相同的实例,所以他们可以将其用作   互动点。例如,活动A可以检索实例   并调用setValue(3);以后的活动B可以检索实例和   调用getValue()来检索最后一个设置值。公共静态   场/方法

     

使活动/服务之间的数据可访问的另一种方法是   使用公共静态字段和/或方法。你可以访问这些   来自应用程序中任何其他类的静态字段。分享一个   对象,创建对象的活动设置静态字段   指向此对象以及要使用此对象的任何其他活动   object只访问这个静态字段。

     

WeakReferences to Objects的HashMap

     

您还可以使用WeakReferences的HashMap与Long对象   键。当一个活动想要将一个对象传递给另一个活动时,它就是   只需将对象放入地图并发送密钥(这是唯一的   基于计数器或时间戳的长期通过收件人活动   意图额外。收件人活动使用此检索对象   键。

     

持久对象

     

即使应用程序似乎继续运行,系统也可能   选择终止其进程并稍后重新启动它。如果你有数据   你需要从一个活动调用到下一个活动调用   将该数据表示为活动在其中保存的状态   被告知它可能会消失。

     

用于共享复杂的持久性用户定义对象,如下所示   建议使用方法:

     
      
  • 应用程序首选项
  •   
  • 文件
  •   
  • contentProviders
  •   
  • SQLite DB
  •   
     

如果共享数据需要保留在哪些点之间   可以杀死应用程序进程,然后将该数据置于持久性状态   存储,如应用程序首选项,SQLite数据库,文件或   ContentProviders。有关更多详细信息,请参阅数据存储   关于如何使用这些组件。

答案 1 :(得分:0)

您可能应该重写活动或片段onSaveInstanceState(Bundle)函数。这将允许您设置要在同一活动或片段的实例之间保存的任何数据。这是在旋转之间进行保存的正确方法。

**更新**

由于您有一个包含一个或多个Hashmaps的ArrayList,您可能需要将两个对象保存到该包中。一个是数组中的HashMaps数,然后是每个HashMap。由于HashMaps是Serializable,您可以使用Bundle.putSerializable将每个HashMaps放入bundle中。您需要将所需信息放入bundle中,以便在OnResume()中重新创建ArrayList。

一种方法可能就是这样:每个HashMap的键都是“Hashmap1”,“Hashmap2”等字符串,每个HashMap都是如此。然后,如果您知道要从包中检索的HashMaps的数量和密钥格式,则可以重新创建ArrayList。