使包含不同对象的 ArrayList<?> 可打包

Make ArrayList<?> containing different objects parcelable

我有两种自定义对象 MovieDetailedMovie,它们存储在 ArrayList<Object> 中。完成网络操作后,我的 ArrayList 专门填充了 Movie 类型或 DetailedMovie 类型的对象。我正在使用类型对象列表,因为它们链接到适配器,然后适配器根据列表中的对象类型对视图进行排序。

所以,问题是我想将 ArrayList 的内容存储到 onSaveInstanceState 中的 Bundle 中。我的 Movie 和 DetailedMovie 对象都实现了 Parcelable,但是当我尝试

List<Object> mObjectMovieList = new ArrayList<>();

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelableArrayList(MOVIE_LIST_KEY, mObjectMovieList);
}

有人告诉我

Wrong 2nd argument type. Found: 'java.util.List<java.lang.Object>', required: 'java.util.ArrayList<? extends android.os.Parcelable>'

我该如何解决这个问题?

这样做的原因是 Object class 没有扩展 Parcelable.

第一个选项

我在这里建议的解决方案之一是创建一个扩展 Parcelable 的父级 class,然后 MovieDetailedMovie 扩展 [=42] =].

所以,它看起来像:

List<MovieWrapper> mObjectMovieList = new ArrayList<>();

其中 MovieWrapperMovieDetailedMovie

的父级
class Movie extends MovieWrapper 

class DetailedMovie extends MovieWrapper

第二个选项

另一种选择是将数组过滤为特定类型,然后调用 putParcelableArrayList

ArrayList<Movie> movieList = mObjectMovieList.stream().filter(p->p instanceOf Movie).collect(Collectors.toCollection(ArrayList::new));
ArrayList<DetailedMovieList> detailedMovieList = mObjectMovieList.stream().filter(p->p instanceOf DetailedMovieList).collect(Collectors.toCollection(ArrayList::new));

outState.putParcelableArrayList(MOVIE_LIST_KEY, movieList);
outState.putParcelableArrayList(DETAILED_MOVIE_LIST_KEY, detailedMovieList);

您可能需要修改以上代码,因为这只是一个建议,可以根据需要进行更改。

如果你确定你只使用 Parcelable,你也可以像这样投射你的列表,并且 lint 忽略最终的未投射警告

outState.putParcelableArrayList(MOVIE_LIST_KEY,(ArrayList<Parcelable>) mObjectMovieList);

然后使用 Parcelable 列表:

List<Parcelable> mObjectMovieList = new ArrayList<>();

您可以同时添加 MovieDetailedMovie 个对象。

当你在另一边取回对象时,你必须用

来区分它们
if (obj instanceof Movie) { ... }

更好的选择是使用基本自定义 class 实现 Parcelable 并由您的两个 classes 扩展。

在这种情况下,您只需使用 List<MyBaseClass> mObjectMovieList = new ArrayList<>()

如果基础 class 公开了足够多的行为方法,您可能不需要使用 instanceof,这将是一个更好的情况。