ArrayList<HashMap<String, String>>
バンドルで保持できますか?
ListView
画面を回転させた直後に表示したい。
に保存する必要はありませんBundle
。実際、これはに保存する情報がたくさんあるようBundle
です。
HashMap
オブジェクトのを保存しているだけなのでString
、クラスを作成してキャッシュするかstatic
、クラスのフィールドにすることができます。
静的フィールドActivity
は、または、View
またはへの参照が含まれていない限り、使用しても問題ありませんDrawable
。(メモリリークが発生する可能性があります)
これを行う最も簡単な方法は次のとおりです。
private static HashMap<String,String> myMap = new HashMap<String,String>();
このフィールドはstatic
であるため、アクティビティが再作成されたときに再作成されません。むしろ、同じ値で使用するためにまだそこにあります。
データを保存するその他の方法:
(これらの手法は、構成の変更によるデータの共有にも適用されます)。
http://developer.android.com/guide/faq/framework.html#3
単一のアプリケーション内のアクティビティ/サービス間でデータを渡すにはどうすればよいですか?
共有するデータの種類によって異なります。
プリミティブデータ型
アプリケーションのアクティビティ/サービス間でプリミティブデータを共有するには、Intent.putExtras()を使用します。永続化する必要のあるプリミティブデータを渡すには、Preferencesストレージメカニズムを使用します。
非永続オブジェクト
複雑な非永続的なユーザー定義オブジェクトを短期間に共有するには、次のアプローチをお勧めします。
シングルトンクラス
シングルトンを使用することで、アプリケーションコンポーネントが同じプロセスで実行されるという事実を利用できます。これは、インスタンスが1つだけになるように設計されたクラスです。インスタンスを返すgetInstance()などの名前の静的メソッドがあります。このメソッドが初めて呼び出されると、グローバルインスタンスが作成されます。すべての呼び出し元は同じインスタンスを取得するため、これを対話のポイントとして使用できます。たとえば、アクティビティAはインスタンスを取得し、setValue(3)を呼び出す場合があります。後のアクティビティBはインスタンスを取得し、getValue()を呼び出して最後に設定された値を取得する場合があります。パブリック静的フィールド/メソッド
アクティビティ/サービス間でデータにアクセスできるようにする別の方法は、パブリック静的フィールドやメソッドを使用することです。これらの静的フィールドには、アプリケーション内の他のクラスからアクセスできます。オブジェクトを共有するために、オブジェクトを作成するアクティビティは、このオブジェクトを指すように静的フィールドを設定し、このオブジェクトを使用する他のアクティビティは、この静的フィールドにアクセスするだけです。
オブジェクトへの弱参照のハッシュマップ
Longキーを持つオブジェクトへのWeakReferencesのHashMapを使用することもできます。アクティビティがオブジェクトを別のアクティビティに渡したい場合は、オブジェクトをマップに配置し、インテントエクストラを介してキー(カウンターまたはタイムスタンプに基づく一意のLong)を受信者のアクティビティに送信します。受信者のアクティビティは、このキーを使用してオブジェクトを取得します。
永続オブジェクト
アプリケーションが実行を継続しているように見えても、システムはそのプロセスを強制終了し、後で再起動することを選択する場合があります。あるアクティビティの呼び出しから次のアクティビティの呼び出しまで保持する必要のあるデータがある場合は、そのデータを、アクティビティがなくなる可能性があることが通知されたときにアクティビティによって保存される状態として表す必要があります。
複雑な永続的なユーザー定義オブジェクトを共有するには、次のアプローチをお勧めします。
- アプリケーション設定
- ファイル
- contentProviders
- SQLite DB
アプリケーションプロセスを強制終了できるポイント間で共有データを保持する必要がある場合は、そのデータをアプリケーション設定、SQLite DB、ファイル、ContentProviderなどの永続ストレージに配置します。これらのコンポーネントの使用方法の詳細については、データストレージを参照してください。
おそらく、ActivityまたはFragments onSaveInstanceState(Bundle)関数をオーバーライドする必要があります。これにより、同じアクティビティまたはフラグメントのインスタンス間で保存するデータを設定できます。これは、ローテーション間で保存する正しい方法です。
** 更新しました **
1つ以上のハッシュマップを含むArrayListがあるため、2つのオブジェクトをバンドルに保存する必要がある場合があります。1つは、配列内にあるHashMapの数であり、次に各HashMapです。HashMapはシリアル化可能であるため、Bundle.putSerializableを使用して、各HashMapをバンドルに配置できます。OnResume()でArrayListを再作成するには、必要な情報をバンドルに配置する必要があります。
1つの方法は次のとおりです。各HashMapのキーを、各HashMapの「Hashmap1」、「Hashmap2」などの文字列にします。次に、バンドルから取得するHashMapの数とキー形式がわかっている場合は、ArrayListを再作成できます。