Nie trzeba tworzyć nowej klasy, aby przekazać ArrayList swoich niestandardowych obiektów. Powinieneś po prostu zaimplementować klasę Parcelable dla swojego obiektu i użyć Bundle#putParcelableArrayList() w onSaveInstanceState()
i onRestoreInstanceState()
. Ta metoda sama zachowa ArrayList of Parcelables.
Ponieważ przedmiotem Parcelables (i Serializables i zestawy) czasami sprawia, że mój ból głowy, tutaj jest podstawowym przykładem ArrayList zawierającej zwyczaj Parcelable obiektów przechowywanych w wiązce. (To jest cięty & pasta runnable, nie układ niezbędny.)
wykonawcze 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];
}
};
}
Save/Restore członkowskie
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);
}
}
Dzięki! Jednak jestem zagubiony na 'private MyObject (Parcel in) { color = in.readString(); number = in.readString(); } 'bit ... To jest łatwe dla Strings, ale jak mogę odczytać moją własną listę tablic? 'in.readArrayList (MyObject.class.getClassLoader())' daje mi błąd. – Kalina
Hmm, w pytaniu pytałeś o "ArrayList z niestandardowymi obiektami", co oznacza "ArrayList", którą ta odpowiedź obsługuje w 'Parcelable.Creator'; jednak twój komentarz po prostu zapytał "jak mogę odczytać moją własną listę tablic", co oznacza "MyArrayList". Jakiej klasy starasz się przedłużyć? (Przepraszam za techniczne, ale chcę dać ci najlepszą odpowiedź najszybciej.) –
Sam
Przepraszam, mam na myśli ArrayList –
Kalina