我试图在包中保存对象的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);
}
当我们学习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中的构
我在ubuntu 18.04上运行maven 3.6.0。 我的应用程序的pom.xml包括这个依赖项;关联的“neptus”jar在我的本地. m2/repository中: 我的应用程序实际上引用了“neptus”jar文件中的类,所以我想在我的项目的uberjar中包含这些类。因此,pom.xml也包括这个,改编自http://maven.apache.org/plugins/maven-s