カスタムオブジェクトの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);
}
}
出典
2012-09-19 22:40:07
Sam
ありがとう!しかし、私は 'Private MyObject(Parcel in){ color = in.readString();で失われています。 番号= in.readString(); } 'ビット...それは文字列にとっては簡単ですが、私はどのように私のカスタムarraylistを読むのですか? 'in.readArrayList(MyObject.class.getClassLoader())'は私にエラーを与えます。 – Kalina
ええと、あなたの質問では、 "ArrayList"を意味する "カスタムオブジェクトを持つArrayList"について質問しました。この答えは 'Parcelable.Creator'で処理されます。あなたのコメントは「MyArrayList」を意味する「私のカスタムarraylistをどうやって読むのですか?」と尋ねました。どんな授業を伸ばしようとしていますか? (技術的には申し訳ありませんが、最速の回答が得られます) –
Sam
ArrayList –
Kalina