使包含不同对象的 ArrayList<?> 可打包
Make ArrayList<?> containing different objects parcelable
我有两种自定义对象 Movie
和 DetailedMovie
,它们存储在 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,然后 Movie
和 DetailedMovie
扩展 [=42] =].
所以,它看起来像:
List<MovieWrapper> mObjectMovieList = new ArrayList<>();
其中 MovieWrapper
是 Movie
和 DetailedMovie
的父级
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<>();
您可以同时添加 Movie
和 DetailedMovie
个对象。
当你在另一边取回对象时,你必须用
来区分它们
if (obj instanceof Movie) { ... }
更好的选择是使用基本自定义 class 实现 Parcelable
并由您的两个 classes 扩展。
在这种情况下,您只需使用 List<MyBaseClass> mObjectMovieList = new ArrayList<>()
。
如果基础 class 公开了足够多的行为方法,您可能不需要使用 instanceof
,这将是一个更好的情况。
我有两种自定义对象 Movie
和 DetailedMovie
,它们存储在 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,然后 Movie
和 DetailedMovie
扩展 [=42] =].
所以,它看起来像:
List<MovieWrapper> mObjectMovieList = new ArrayList<>();
其中 MovieWrapper
是 Movie
和 DetailedMovie
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<>();
您可以同时添加 Movie
和 DetailedMovie
个对象。
当你在另一边取回对象时,你必须用
来区分它们if (obj instanceof Movie) { ... }
更好的选择是使用基本自定义 class 实现 Parcelable
并由您的两个 classes 扩展。
在这种情况下,您只需使用 List<MyBaseClass> mObjectMovieList = new ArrayList<>()
。
如果基础 class 公开了足够多的行为方法,您可能不需要使用 instanceof
,这将是一个更好的情况。