2012-09-19 12 views
48

ArrayList私は、画面上で保存して復元できるようにしたいカスタムオブジェクトを持っています。Androidの画面にカスタムArrayListを保存するにはどうすればいいですか?

私はParcelableまたはSerializableのいずれかを実装しArrayList独自のクラスを作成した場合、これはonSaveInstanceStateonRestoreInstanceStateで行うことができることを知っている...しかし、別のクラスを作成せずにこれを行う方法はありますか?

答えて

81

カスタムオブジェクトのArrayListを渡すために新しいクラスを作成する必要はありません。オブジェクトのParcelableクラスを実装し、onSaveInstanceState()onRestoreInstanceState()Bundle#putParcelableArrayList()を使用するだけです。このメソッドはParcelableのArrayListを単独で格納します。


Parcelables(およびSerializablesとバンドル)の主題は時々私の頭の痛くなりますので、ここではバンドルに保存されているカスタムParcelableオブジェクトを格納するArrayListの基本的な例です。 (これは、実行可能な&ペースト、必要に応じていないレイアウトをカットされています。)

実装Parcelable

public class MyObject implements Parcelable { 
    String color; 
    String number; 

    public MyObject(String number, String color) { 
     this.color = color; 
     this.number = number; 
    } 

    private MyObject(Parcel in) { 
     color = in.readString(); 
     number = in.readString(); 
    } 

    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public String toString() { 
     return number + ": " + color; 
    } 

    public void writeToParcel(Parcel out, int flags) { 
     out.writeString(color); 
     out.writeString(number); 
    } 

    public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() { 
     public MyObject createFromParcel(Parcel in) { 
      return new MyObject(in); 
     } 

     public MyObject[] newArray(int size) { 
      return new MyObject[size]; 
     } 
    }; 
} 

保存/アメリカあなたがonRetainNonConfigurationInstance()を使用することができます

public class Example extends ListActivity { 
    ArrayList<MyObject> list; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if(savedInstanceState == null || !savedInstanceState.containsKey("key")) { 
      String[] colors = {"black", "red", "orange", "cyan", "green", "yellow", "blue", "purple", "magenta", "white"}; 
      String[] numbers = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"}; 

      list = new ArrayList<MyObject>(); 
      for(int i = 0; i < numbers.length; i++) 
       list.add(new MyObject(numbers[i], colors[i])); 
     } 
     else { 
      list = savedInstanceState.getParcelableArrayList("key"); 
     } 

     setListAdapter(new ArrayAdapter<MyObject>(this, android.R.layout.simple_list_item_1, list)); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putParcelableArrayList("key", list); 
     super.onSaveInstanceState(outState); 
    } 
} 
+1

ありがとう!しかし、私は 'Private MyObject(Parcel in){ color = in.readString();で失われています。 番号= in.readString(); } 'ビット...それは文字列にとっては簡単ですが、私はどのように私のカスタムarraylistを読むのですか? 'in.readArrayList(MyObject.class.getClassLoader())'は私にエラーを与えます。 – Kalina

+1

ええと、あなたの質問では、 "ArrayList "を意味する "カスタムオブジェクトを持つArrayList"について質問しました。この答えは 'Parcelable.Creator'で処理されます。あなたのコメントは「MyArrayList」を意味する「私のカスタムarraylistをどうやって読むのですか?」と尋ねました。どんな授業を伸ばしようとしていますか? (技術的には申し訳ありませんが、最速の回答が得られます) – Sam

+0

ArrayList Kalina

3

を復元します。構成変更の前にオブジェクトを保存してから、getLastNonConfigurationInstanceState()で復元することができます。ランタイム変更の処理

try{ 
     ArrayList myArrayList = (ArrayList)getLastNonConfigurationInstance(); 
    } catch(NullPointerException e) {} 

活動インサイド

@Override 
    public Object onRetainNonConfigurationInstance() { 
     return myArrayList; 
    } 

onCreate()インサイドhttp://developer.android.com/guide/topics/resources/runtime-changes.html ドキュメント:http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance%28%29

+0

うわー、その機能については決して知らなかった!スーパーシンプルで正確に私が必要なもの...しかし、私はそれが非難されていることを参照してください... – Kalina

+0

残念ながら、それはまだ動作し、これを行うための他の簡単な方法はありません。サムの答えは私が見つけた唯一の他の方法ですが、実装するのはもっと難しいです。 – Techwolf

+3

フラグメントを使用している場合は、代わりに 'Fragment.setRetainInstance(true)'を使用することができます。これは新しいバージョンですが、フラグメントでのみ機能します。ドキュメント:http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean) – Techwolf

-2

はい、あなたは共有設定で、あなたの複合オブジェクトを保存することができます。さんが言ってみましょう:

Student mStudentObject = new Student(); 
    SharedPreferences appSharedPrefs = PreferenceManager 
     .getDefaultSharedPreferences(this.getApplicationContext()); 
     Editor prefsEditor = appSharedPrefs.edit(); 
     Gson gson = new Gson(); 
     String json = gson.toJson(mStudentObject); 
     prefsEditor.putString("MyObject", json); 
     prefsEditor.commit(); 

、今、あなたはあなたのようオブジェクトを取得することができます。

 SharedPreferences appSharedPrefs = PreferenceManager 
    .getDefaultSharedPreferences(this.getApplicationContext()); 
    Editor prefsEditor = appSharedPrefs.edit(); 
    Gson gson = new Gson(); 
    String json = appSharedPrefs.getString("MyObject", ""); 
    Student mStudentObject = gson.fromJson(json, Student.class); 
+1

リストのサイズが保存されます。 SharedPreferencesはXMLファイルです。巨大なデータセットを格納するために設計されていません。 – mwieczorek

関連する問題