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

标签 android object arraylist parcelable screen-rotation

我有一个带有自定义对象的 ArrayList,我希望能够在屏幕旋转时保存和恢复这些对象。

我知道这可以通过 onSaveInstanceStateonRestoreInstanceState 来完成,如果我要让 ArrayList 成为它自己的类,它实现了 ParcelableSerializable... 但是有没有办法在不创建另一个类的情况下做到这一点?

最佳答案

您不需要创建新类来传递自定义对象的 ArrayList。您应该简单地为您的对象实现 Parcelable 类并使用 Bundle#putParcelableArrayList()onSaveInstanceState()onRestoreInstanceState() 中。这个方法会自己存储一个 Parcelables 的 ArrayList。


因为 Parcelables(以及 Serializables 和 Bundles)的主题有时会让我头疼,这里有一个 ArrayList 的基本示例,其中包含存储在 Bundle 中的自定义 Parcelable 对象。 (这是可剪切和粘贴运行的,无需布局。)

实现 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];
        }
    };
}

保存/恢复状态

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);
    }
}

关于android - 如何在 Android 屏幕旋转上保存自定义 ArrayList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12503836/

相关文章:

android - react-native 如何在特定时间安排后台作业

javascript:将对象添加到对象

javascript - 从对象数组创建一个新对象

java - 为什么我会收到缺少类型参数和类型转换的警告?

java - 列表<? super B> lsb = new ArrayList<A>(); Java中的逻辑错误?

java - 如何将依赖项注入(inject)到需要前一个 Activity 参数的 Activity 中?

java - 如何使用 Android 中 FirstActivity 的数据填充 SecondActivity 上的 ListView?

java - 新线程是否自动分配给 Java 中的不同 CPU 核心?

php - 关于 var_dump 输出的问题

android - 从复选框中取消选中时如何从数组中删除元素?