Search code examples
javaandroidparcelable

Parcelable Implementation for Custom Objects


I have 3 POJO types: a Recipe, which contains ingredients, and then the ingredients contain steps. Below is my setup, I am trying to implement Parcelable and cannot determine the appropriate read and write methods:

Recipe.Java:

public class Recipe implements Parcelable {


protected List<Ingredients> ingredients;

private String id;

private String servings;

private String name;

private String image;

private List<Steps> steps;

protected Recipe(Parcel in) {
    in.createTypedArray(CREATOR.createFromParcel(Ingredients));
    in.createTypedArray(Ingredients.);
    id = in.readString();
    servings = in.readString();
    name = in.readString();
    image = in.readString();
    steps = in.readArrayList(ClassLoader.getSystemClassLoader());
}

public static final Creator<Ingredients> CREATOR = new Creator<Ingredients>() {
    @Override
    public Ingredients createFromParcel(Parcel parcel) {
        return new Ingredients(parcel);
    }

    @Override
    public Ingredients[] newArray(int i) {
        return new Ingredients[0];
    }
}


public static final Creator<Recipe> CREATOR = new Creator<Recipe>() {
    @Override
    public Recipe createFromParcel(Parcel in) {
        return new Recipe(in);
    }

    @Override
    public Recipe[] newArray(int size) {
        return new Recipe[size];
    }
};

public List<Ingredients> getIngredients() {
    return ingredients;
}

public void setIngredients(List<Ingredients> ingredients) {
    this.ingredients = ingredients;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getServings() {
    return servings;
}

public void setServings(String servings) {
    this.servings = servings;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getImage() {
    return image;
}

public void setImage(String image) {
    this.image = image;
}

public List<Steps> getSteps() {
    return steps;
}

public void setSteps(List<Steps> steps) {
    this.steps = steps;
}

@Override
public String toString() {
    return "ClassPojo [ingredients = " + ingredients + ", id = " + id + ", servings = " + servings + ", name = " + name + ", image = " + image + ", steps = " + steps + "]";
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeString(id);
    parcel.writeString(servings);
    parcel.writeString(name);
    parcel.writeString(image);
    }
 }

Ingredients.Java:

public class Ingredients {

private String measure;

private String ingredient;

private String quantity;

public Ingredients(Parcel parcel) {
}

public String getMeasure ()
{
    return measure;
}

public void setMeasure (String measure)
{
    this.measure = measure;
}

public String getIngredient ()
{
    return ingredient;
}

public void setIngredient (String ingredient)
{
    this.ingredient = ingredient;
}

public String getQuantity ()
{
    return quantity;
}

public void setQuantity (String quantity)
{
    this.quantity = quantity;
}

@Override
public String toString()
{
    return "ClassPojo [measure = "+measure+", ingredient = "+ingredient+", quantity = "+quantity+"]";
   }
}

Steps.Java:

public class Steps {

private String id;

private String shortDescription;

private String description;

private String videoURL;

private String thumbnailURL;

public String getId ()
{
    return id;
}

public void setId (String id)
{
    this.id = id;
}

public String getShortDescription ()
{
    return shortDescription;
}

public void setShortDescription (String shortDescription)
{
    this.shortDescription = shortDescription;
}

public String getDescription ()
{
    return description;
}

public void setDescription (String description)
{
    this.description = description;
}

public String getVideoURL ()
{
    return videoURL;
}

public void setVideoURL (String videoURL)
{
    this.videoURL = videoURL;
}

public String getThumbnailURL ()
{
    return thumbnailURL;
}

public void setThumbnailURL (String thumbnailURL)
{
    this.thumbnailURL = thumbnailURL;
}

@Override
public String toString()
{
    return "ClassPojo [id = "+id+", shortDescription = "+shortDescription+", description = "+description+", videoURL = "+videoURL+", thumbnailURL = "+thumbnailURL+"]";
  }

}


Solution

  • I suggest you to use third party library such as Paperparcel to reduce boilerplate.

    Sample of usage:

    @PaperParcel // (1)
    public final class User implements Parcelable {
        public static final Creator<User> CREATOR = PaperParcelUser.CREATOR; // (2)
    
        long id; // (3)
        String firstName; // (3)
        String lastName; // (3)
    
        @Override public int describeContents() {
            return 0;
        }
    
        @Override public void writeToParcel(Parcel dest, int flags) {
            PaperParcelUser.writeToParcel(this, dest, flags); // (4)
        }
    }