android - 使用 Parcelable 将 List<Object> 保存到实例状态

标签 android arraylist android-recyclerview android-savedstate

我有以下模型:

GitItem:

    public class GitItem implements Serializable, Parcelable {
        public int id;
        public String name;
        public String full_name;
        public GitOwner owner;

        public GitItem() {
        }

        public GitItem(Parcel in) {
            id = in.readInt();
            name = in.readString();
            full_name = in.readString();
        }

        public int describeContents() {
            return 0;
        }

        public void writeToParcel(Parcel out, int flags){
            out.writeInt(id);
            out.writeString(name);
            out.writeString(full_name);
        }

        public static final Parcelable.Creator<GitItem> CREATOR = new Parcelable.Creator<GitItem>(){

            @Override
            public GitItem createFromParcel(Parcel source) {
                return new GitItem(source);
            }

            @Override
            public GitItem[] newArray(int size) {
                return new GitItem[size];
            }
        };
    }

和 GitOwner:

public class GitOwner implements Serializable, Parcelable {
    public String avatar_url;

    public GitOwner(Parcel in) {
        avatar_url = in.readString();
    }

    public GitOwner() {
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {

    }

    public static final Parcelable.Creator<GitOwner> CREATOR = new Parcelable.Creator<GitOwner>(){

        @Override
        public GitOwner createFromParcel(Parcel source) {
            return  new GitOwner(source);
        }

        @Override
        public GitOwner[] newArray(int size) {
            return new GitOwner[size];
        }
    };
}

然后在 MainActivity.java 我有一个 List<GitItem> data;绑定(bind)到我的 RecyclerView .

基本上我想要实现的是存储我的 List<GitItem> 的当前状态当我改变 Activity或者简单地旋转设备。不幸的是,即使我已经实现了 Parcelable (正如其他帖子所建议的那样),我无法存储该实例。

在此问题上的任何帮助将不胜感激。

最佳答案

您还没有在 GitOwnerGitItem 类中实现 Parcelable 函数的完整主体,即 writeToParcel

GitOwner 类中

@Override
public void writeToParcel(Parcel dest, int flags) {
     dest.writeString(avatar_url);
     // add this line
}

GitItem 中使用 writeParcelable写和readParcelable读取 GitItem 对象,否则它不会被持久化和恢复

    public GitItem(Parcel in) {
        id = in.readInt();
        name = in.readString();
        full_name = in.readString();
        owner = in.readParcelable(GitItem.class.getClassLoader());
        // Add line to read owner object
    }

    public void writeToParcel(Parcel out, int flags){
        out.writeInt(id);
        out.writeString(name);
        out.writeString(full_name);
        out.writeParcelable(owner , flags);           
        // Add line to write owner object
    }

关于android - 使用 Parcelable 将 List<Object> 保存到实例状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44353561/

相关文章:

android - RecyclerView 中的 RecyclerView : ItemDecoration

android - 不要关闭我的应用程序

java - 如何针对 new Object { } 构造设置 proguard 设置?

android - 需要按两次后退按钮才能从 Activity 中返回

java - Java 哈希表单向链表的空指针异常

android - 如何将 <Spanned> 放入 list.setAdapter?

android - 在没有第 3 方库的情况下将图像从 url 加载到 recyclerview

java - 我无法应用 gradle 6.x 插件

java - 反向遍历 ArrayList 的最快最有效的方法

android-recyclerview - Kotlin - RecyclerView.ViewHolder 子类 - 无法访问额外的属性