我有两种自定义对象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>'
我怎样才能解决这个问题?
答案 0 :(得分:1)
原因是self.browse(self.id).write({'state':'done' })
类不会扩展Object
。
第一个选项
我在此建议的解决方案之一是创建一个扩展Parcelable
的父类,然后Parcelable
和Movie
扩展该类。
所以,它看起来像:
DetailedMovie
其中List<MovieWrapper> mObjectMovieList = new ArrayList<>();
是MovieWrapper
和Movie
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<>();
您可以同时添加Movie
和DetailedMovie
个对象。
当你在另一边检索对象时,你必须用
来区分它们if (obj instanceof Movie) { ... }
更好的选择是拥有一个基本的自定义类实现Parcelable
并由两个类扩展。
在这种情况下,您只需使用List<MyBaseClass> mObjectMovieList = new ArrayList<>()
。
如果基类暴露了足够的行为方法,您可能不需要使用instanceof
,这是一种更好的情况。