1

我有两种自定义对象MovieDetailedMovie它们存储在ArrayList<Object>. 进行网络操作后, myArrayList仅填充 typeMovie或 type 的对象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>'

我怎样才能解决这个问题?

4

3 回答 3

2

这样做的原因是Object类不扩展Parcelable

第一个选项

我可以在这里建议的解决方案之一是创建一个扩展的父类,然后Parcelable扩展 该类。MovieDetailedMovie

所以,它看起来像:

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

MovieWrapper的父母在哪里MovieDetailedMovie

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);

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

于 2018-04-01T15:56:20.903 回答
1

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

outState.putParcelableArrayList(MOVIE_LIST_KEY,(ArrayList<Parcelable>) mObjectMovieList);
于 2018-04-01T16:04:43.440 回答
0

然后使用Parcelable列表:

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

您可以同时添加MovieDetailedMovie对象。

当您检索另一侧的对象时,您必须区分它们

if (obj instanceof Movie) { ... }

更好的选择是实现一个基自定义类Parcelable并由您的两个类扩展。

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

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

于 2018-04-01T16:23:17.070 回答