Parceler:如何解决问题:错误:项目是抽象的;无法实例化

时间:2016-10-03 07:52:46

标签: java android bundle parcel parceler

我尝试通过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

1 个答案:

答案 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;