使ArrayList <! - ? - >包含可分配的不同对象

时间:2018-04-01 15:53:47

标签: java android parcelable onsaveinstancestate

我有两种自定义对象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>'

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

3 个答案:

答案 0 :(得分:1)

原因是self.browse(self.id).write({'state':'done' })类不会扩展Object

第一个选项

我在此建议的解决方案之一是创建一个扩展Parcelable的父类,然后ParcelableMovie扩展该类。

所以,它看起来像:

DetailedMovie

其中List<MovieWrapper> mObjectMovieList = new ArrayList<>(); MovieWrapperMovie

的父级
DetailedMovie

第二个选项

另一种选择是将数组过滤为特定类型,然后调用class Movie extends MovieWrapper class DetailedMovie extends MovieWrapper

putParcelableArrayList

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

然后使用Parcelable列表:

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

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

当你在另一边检索对象时,你必须用

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

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

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

如果基类暴露了足够的行为方法,您可能不需要使用instanceof,这是一种更好的情况。