【发布时间】:2022-01-20 07:56:41
【问题描述】:
当我将 parcelable arraylist 放入包中并使用getParcelableArrayList 获取它时,所有元素都正确显示,而最后一个元素显示为空字符串。
我的自定义 Parcelable 物品:
public class Media implements Parcelable {
private final Uri uri;
private Type type;
private InfoModel infoModel;
public Media(Uri uri, Type type) {
this.uri = uri;
this.type = type;
this.infoModel = InfoModel.empty();
}
public Media() {
this.uri = null;
this.type = Type.image;
this.infoModel = InfoModel.empty();
}
protected Media(Parcel in) {
uri = in.readParcelable(Uri.class.getClassLoader());
type = Type.valueOf(in.readString());
infoModel = in.readParcelable(InfoModel.class.getClassLoader());
}
public void setInfoModel(InfoModel infoModel) {
this.infoModel = infoModel;
}
public InfoModel getInfoModel() {
return infoModel;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(uri, flags);
dest.writeString(this.type.name());
dest.writeParcelable(infoModel, flags);
}
public static final Creator<Media> CREATOR = new Creator<Media>() {
@Override
public Media createFromParcel(Parcel in) {
return new Media(in);
}
@Override
public Media[] newArray(int size) {
return new Media[size];
}
};
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Media media = (Media) o;
return uri.equals(media.uri);
}
@Override
public int hashCode() {
return uri.hashCode();
}
}
当我检查 bundle 中的媒体列表时,我发现没有问题 -> bundleIntent 函数:
public class ShowMediaActivity extends Activity {
public static Intent buildIntent(@NonNull ArrayList<Media> medias) {
Intent intent = new Intent(this, ShowMediaActivity.class);
Bundle b = new Bundle();
b.putParcelableArrayList(KEY_MEDIA, medias);
intent.putExtra("bundle", b);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
Logger.i();
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_container);
Bundle b = getIntent().getBundleExtra("bundle");
List<Media> initialMedia = new ArrayList<>();
if (b != null) {
initialMedia = b.getParcelableArrayList(KEY_MEDIA);
}
}
onCreate 中的initialMedia 元素:
initialMedia 有 1 个元素:媒体
initialMedia 有 2 个元素:Media, ""
initialMedia 有 3 个元素:Media、Media、""
initialMedia 有 4 个元素:Media、Media、Media、""
【问题讨论】:
-
您是否在 RUNTIME 中验证了最后一个元素是否真的是字符串,或者您只是在调试期间使用 IDE Inspector 验证它?有时 Inspector 会显示错误的值(很少见,但有时会发生)。尝试在 LogCat 中打印类似于“Log.d(TAG, List[n].class.getName())”的内容
-
我在调试中试过了。我也尝试了 logcat,它给出了相同的结果。
-
那么最后一个元素的类是“java.lang.String”而不是之前的“a.b.Media”?
-
就像你说的
-
我只是复制/粘贴了您的代码并进行了模拟。它按预期工作,检索正确的“initialMedia”变量。也许您还有其他东西可以在该数组中添加/插入项目(可能通过反射)。不可能有一个 ArrayList 里面有这些不均匀的项目。 String 不是 Parcelable,不能正常插入/添加到 Parcelables 的 ArrayList 中。
标签: android arraylist parcelable