如何在Android屏幕上保存自定义ArrayList旋转?

Kal*_*ina 50 android arraylist object parcelable screen-rotation

我有一个ArrayList自定义对象,我希望能够在屏幕上保存和恢复旋转.

我知道,这是可以做到的onSaveInstanceStateonRestoreInstanceState如果我让ArrayList自己的类,它实现了无论是Parcelable还是Serializable......但是,有没有办法做到这一点,而无需创建另一个类?

Sam*_*Sam 85

您无需创建新类来传递自定义对象的ArrayList.您应该简单地实现Parcelable类的对象,并使用束#putParcelableArrayList()onSaveInstanceState()onRestoreInstanceState().此方法将自行存储Parcelables的ArrayList.


因为Parcelables(以及Serializables和Bundles)的主题有时让我头疼,这里是一个包含存储在Bundle中的自定义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];
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

保存/恢复状态

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 好的,那么你不需要在你的对象类中使用`readArrrayList()`.查看我发布的示例Activity中的`onCreate()`.我检查:如果`ArrayList <MyObject>`还不存在,那就去做吧; 如果确实存在,请在`ArrayList <MyObject>`中读取`list = savedInstanceState.getParcelableArrayList("key");`.这有意义吗?如果有帮助,我可以更详细地评论我的例子. (2认同)