我尝试通过Parceler compile 'org.parceler:parceler-api:1.1.5'
接收列表项,我的代码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
List<NavItem> navItems = new ArrayList<>();
navItems.add(new CategoryItem("CategoryItem"));
navItems.add(new SubCatItem("SubCatItem"));
NavItemsWraper wraper = new NavItemsWraper(navItems);
Intent data = new Intent();
data.putExtra("data", Parcels.wrap(wraper));
NavItemsWraper recievedWraper = Parcels.unwrap(data.getParcelableExtra("data"));
recievedWraper.getNavItems();
for (NavItem item:recievedWraper.getNavItems()){
Log.e(TAG, "onCreate: "+item.title);
}
}
类:
NavItem
@Parcel
public abstract class NavItem {
public String title;
public NavItem(){
}
public NavItem(String subCatItem) {
this.title=subCatItem;
}
}
NavItemsWrapper
@Parcel
public class NavItemsWraper {
private List<NavItem> navItems;
public NavItemsWraper(){
}
public NavItemsWraper(List<NavItem> navItems) {
this.navItems=navItems;
}
public List<NavItem> getNavItems() {
return navItems;
}
}
CategoryItem
@Parcel
public class CategoryItem extends NavItem {
public CategoryItem(){
}
public CategoryItem(String categoryItem) {
super(categoryItem);
}
}
SubCategoryItem
@Parcel
public class SubCatItem extends NavItem {
public SubCatItem() {
}
public SubCatItem(String subCatItem) {super(subCatItem);}
}
编译错误是:
...\app\build\generated\source\apt\debug\com\test\objs\NavItem$$Parcelable.java
Error:(63, 26) error: NavItem is abstract; cannot be instantiated
答案 0 :(得分:0)
通过添加:
修复@Parcel(converter = NavigationItem.NavigationItemConverter.class)
public abstract class NavigationItem {
...
public static class NavigationItemConverter implements ParcelConverter<NavigationItem> {
public static final int KEY_CategoryItem = 1;
public static final int KEY_SubCatItem = 2;
@Override
public void toParcel(NavigationItem input, android.os.Parcel parcel) {
if (input == null) {
parcel.writeInt(-1);
} else {
if (input instanceof CategoryItem) {
parcel.writeInt(KEY_CategoryItem);
parcel.writeParcelable(Parcels.wrap((CategoryItem) input), 0);
}
if (input instanceof SubCategoryItem) {
parcel.writeInt(KEY_SubCatItem);
parcel.writeParcelable(Parcels.wrap((SubCategoryItem) input), 0);
}
}
}
@Override
public NavigationItem fromParcel(android.os.Parcel parcel) {
NavigationItem item = null;
int key = parcel.readInt();
if (key == KEY_CategoryItem){
item = Parcels.unwrap(parcel.readParcelable(CategoryItem.class.getClassLoader()));
}
if (key == KEY_SubCatItem){
item = Parcels.unwrap(parcel.readParcelable(SubCategoryItem.class.getClassLoader()));
}
return item;
}
}
public static class NavigationListConverter implements ParcelConverter<List<NavigationItem>> {
@Override
public void toParcel(List<NavigationItem> input, android.os.Parcel parcel) {
if (input == null) {
parcel.writeInt(-1);
} else {
parcel.writeInt(input.size());
for (NavigationItem item : input) {
parcel.writeParcelable(Parcels.wrap(item), 0);
}
}
}
@Override
public List<NavigationItem> fromParcel(android.os.Parcel parcel) {
int size = parcel.readInt();
if (size < 0) return null;
List<NavigationItem> items = new ArrayList<NavigationItem>();
for (int i = 0; i < size; ++i) {
NavigationItem item = Parcels.unwrap(parcel.readParcelable(NavigationItem.class.getClassLoader()));
items.add(item);
}
return items;
}
}
并添加到
@Parcel
public class NavItemsWraper {
@ParcelPropertyConverter(NavigationItem.NavigationListConverter.class)
private List<NavItem> navItems;