3

I have Product class.I want to pass product object one activity to another.

I have implemented like this :

 public class Product implements Parcelable{
     private double availableQuantity;
     private double price;
     private String productCode;    
     private String description;
     private String nonStockItemFlag;   
     private String activeFlag;
     private String kitProductFlag;
     private double value;
     private ArrayList<Product> product;
     private double qty;

    public Product() {

}


/**
 * @param availableQuantity
 * @param price
 * @param productCode
 * @param description
 * @param nonStockItemFlag
 * @param kitProductFlag
 * @param qty
 * @param grossValue
 * @param value
 */

public Product(double availableQuantity, double price, String productCode,
        String description, String nonStockItemFlag, String kitProductFlag,
        double qty,  double value) {
    super();
    this.availableQuantity = availableQuantity;
    this.price = price;
    this.productCode = productCode;
    this.description = description;
    this.nonStockItemFlag = nonStockItemFlag;
    this.kitProductFlag = kitProductFlag;
    this.qty = qty;
    this.value = value;
}
     // setter & getter


public int describeContents() {
    return 0;
}


public void writeToParcel(Parcel dest, int flags) {

    Bundle b = new Bundle();
    b.putParcelableArrayList("enteredProduct", product);
    dest.writeBundle(b);
}


public static final Parcelable.Creator<Product> CREATOR = new Parcelable.Creator<Product>() { 
    public Product createFromParcel(Parcel in) { 
        Product prod = new Product();

    Bundle b = in.readBundle(Product.class.getClassLoader());        
    prod.product = b.getParcelableArrayList("enteredProduct");
    System.out.println("***product***" + prod.product.get(0).getPrice());
    return prod;
    }

public Product[] newArray(int size) {
    return new Product[size];
}
 };

This is caller part :

   if(productMap.size() >0){
         ArrayList<Product> enteredProductList = new ArrayList<Product>(productMap.values());
         System.out.println("-enteredProductList --" + enteredProductList.size());
         System.out.println("--- " +enteredProductList.get(0).getPrice() );
         Bundle b = new Bundle();
         b.putParcelableArrayList("enteredProduct", enteredProductList);
         Intent showContent = new Intent(getApplicationContext(),RetailerOrderIActivity.class);
         showContent.putExtras(b); //Insert the Bundle object in the Intent' Extras
         startActivity(showContent);
     }else{
         Toast.makeText(RetailerOrderActivity.this," You don't have invoice records" ,Toast.LENGTH_SHORT).show();
     }

This is receive part :

    Bundle b = this.getIntent().getExtras();
   ArrayList<Product> p = b.getParcelableArrayList("enteredProduct");
    System.out.println("-- RetailerOrderIActivity --" + p.size() );
    for(Product s : p){
    System.out.println(" --Qty-" + s.getQty());
    System.out.println(" --price -" + s.getPrice());
    System.out.println(" --code -" + s.getProductCode());
    }

The receiving part return null value.But in the sending Activity part contain value.Please correct my code?

what is wrong in my code?

I have lot of property for product entity calss.But i want to set some of entity.

Thanks in advance.

Piraba
  • 6,974
  • 17
  • 85
  • 135

1 Answers1

11

I guess you misunderstood the Parcelable examples. You have to put all needed elements into the parcel, and get it from it later:

To write your object to the parcel, this is needed:

public void writeToParcel(Parcel dest, int flags) 
{
    dest.writeString(productCodce);
    dest.writeString(description);
            // and all other elements
}

Plus, you need a constructor receiving a parcel:

public Product(Parcel in)
{
    this.productCode=in.readString();
    this.description=in.readString();
            // and all other elements
    }

Your Creator should be something like:

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() 
{
    public Product createFromParcel(Parcel in) { return new Product(in); }
    public Product[] newArray(int size) { return new Product[size]; }
};

Now, at your activity level (NOT in your Product class!):

Push it into extras, use:

bundle.putParcelableArrayList("whatevername",products);

To get it from the extras, use a simple:

ArrayList<Product> products=bundle.getParcelableArrayList("whatevername");
Oliver
  • 1,269
  • 13
  • 21
  • Missed one thing: So, now if your Product class contains an ArrayList of Product you want to parcel in, but you can not push an Parcelable in an Parcelable, you need to think about another method to transfer this data. This is not possible. – Oliver Sep 13 '11 at 10:53
  • Please also refer to http://stackoverflow.com/questions/1712557/using-parcelable-with-circular-references or http://stackoverflow.com/questions/3513665/problem-in-implementing-parcelable-containing-other-parcelable – Oliver Sep 13 '11 at 11:00