当前位置: 首页 > 知识库问答 >
问题:

Parcelable类不会生成可包裹的对象

吕骞尧
2023-03-14

我试图在包中保存对象的ArrayList(列表搁置项),以便下次打开活动时检索它。

(活动从firestore获取信息,我想减少每次打开活动时的读取次数并缩短加载时间)。

但我得到了这个错误信息:

savedInstanceState.putParcelableArrayList("key", shelfItems);

“android.os.Bundle”中的putParcelableArrayList(java.lang.String,java.util.ArrayList)不能应用于“(java.lang.String,java.util.List)”

这是我的对象类:

import android.os.Parcel;
import android.os.Parcelable;

public class ShelfItem implements Parcelable{


    private String mTitle;
    private String mAuthor;
    private String mThumbnail;
    private long mRating;
    private long mEndDate;
    private long mBeginDate;
    private String mId;
    private long mPages;
    private boolean mVisible;

    //make ShelfItem object
    public ShelfItem(String title, String author, String thumbnail, long rating, long beginDate, long endDate, String id, long pages, boolean visible) {
        mTitle = title;
        mAuthor = author;
        mThumbnail = thumbnail;
        mRating = rating;
        mBeginDate = beginDate;
        mEndDate = endDate;
        mId = id;
        mPages = pages;
        mVisible = visible;
    }


    public String getTitle() {
        return mTitle;
    }

    public String getAuthor() {
        return mAuthor;
    }

    public String getThumbnail() {
        return mThumbnail;
    }

    public long getRating() {
        return mRating;
    }

    public long getBeginDate() {
        return mBeginDate;
    }

    public long getEndDate() {
        return mEndDate;
    }

    public String getId() {
        return mId;
    }

    public long getPages() {
        return mPages;
    }

    public boolean getVisible() {
        return mVisible;
    }


    public ShelfItem(Parcel in) {
        mId = in.readString();
        mTitle = in.readString();
        mAuthor = in.readString();
        mThumbnail = in.readString();
        mBeginDate = in.readLong();
        mEndDate = in.readLong();
        mPages = in.readLong();
        mVisible = in.readByte() != 0;
        mRating = in.readLong();

    }

    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeString(mId);
        out.writeString(mTitle);
        out.writeString(mAuthor);
        out.writeString(mThumbnail);
        out.writeLong(mBeginDate);
        out.writeLong(mEndDate);
        out.writeLong(mPages);
        out.writeByte((byte) (mVisible ? 1 : 0));
        out.writeLong(mRating);

    }

    public static final Parcelable.Creator<ShelfItem> CREATOR = new Parcelable.Creator<ShelfItem>() {
        public ShelfItem createFromParcel(Parcel in) {
            return new ShelfItem(in);
        }

        public ShelfItem[] newArray(int size) {
            return new ShelfItem[size];
        }
    };

}

这就是我试图保存列表的方式:

@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        savedInstanceState.putParcelableArrayList("key", shelfItems);
    }

共有1个答案

司马昕
2023-03-14

当我们学习Java时,我们被教导在声明变量时使用接口类型(List)而不是实现类型(ArrayList)。您可能在某个地方有这样的代码:

List<ShelfItem> shelfItems = new ArrayList<>();

但是,在Bundle和保存列表的特殊情况下,您必须特别使用ArrayList,而不是任何List

如果我是对的,并且您的列表是像上面所示那样声明的,只需将其更改为显式使用ArrayList

ArrayList<ShelfItem> shelfItems = new ArrayList<>();

如果您从其他地方获取列表,并且无法控制其实现类型,则可以在需要保存时构建一个新的ArrayList:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    ArrayList<ShelfItem> toSave = new ArrayList<>(shelfItems);
    savedInstanceState.putParcelableArrayList("key", toSave);
}
 类似资料:
  • 问题内容: 首先,我必须说,我一直在此站点上寻找我的问题的答案,我发现了有关此异常的多个主题,但毕竟所有主题对我没有太大帮助,所以这就是为什么我要发布这个。 每次尝试从包裹中恢复信息时,我都会遇到“包裹不可修复”异常。这是我的班级代码。 } 和我的活动代码(此活动检索一个意图,该意图带有我刚刚指定的类型的ArrayList) } LOGCAT: 问题答案: 更改此: 对此: 编辑: 而且看起来您的

  • 我使用的是不可变的。org库,并希望添加Javax注释验证。但是我注意到验证没有被带到生成的类中。我认为这是不变的。org与验证注释兼容。我有spring boot starter验证和javax。验证依赖项。 不可变的 控制器: pom。xml

  • 问题内容: 我有一个类的以下实现: 在写/读包裹时保持秩序重要吗?又为什么呢 问题答案: 是的,确实如此 。写入变量的顺序由您决定,您可以根据需要进行操作,但是必须以相同的顺序读取它们。如果顺序不同,它将给您运行时崩溃。 为什么? 机制是盲目的,因此它信任您以正确的顺序进行操作。主要是为了提高性能,因为它不必搜索特定的元素。您可以在接口中看到,它创建的数组的大小与您放入包裹中的多个元素的大小相同。

  • 有人能看到代码出了什么问题吗?很明显,它就在某个地方,甚至可能在子任务类中,因为一构造任务并尝试打包它,仿真器就会崩溃。

  • 我正在使用Android Studio 1.2.2 我的sdk更新良好,安装的build tools版本为22.0.1 我只得到应用程序发布未对齐。apk输入(app/build/outputs/apk/) 我已经在谷歌上搜索并尝试了: > 复制粘贴zipalign.exe从构建工具文件夹到:(i)sdk/tools/(ii)sdk/Platform-tools/ 在build.gradle中的构

  • 相比于单纯的数据对象,将context包装成一个提供一些方法的对象会是更好的实践。因为这样能提供一些方法供我们操作context里面的数据。 // dependencies.js export default { data: {}, get(key) { return this.data[key]; }, register(key, value) { this.da