Search code examples
androidandroid-intentparcelable

List of object is null after passing it via Intent. Object class implements Parcelable interface


This is my way to pass data from Activity:

   Intent intent = new Intent(JobFieldAttribute.this, JobCamera.class);
   intent.putParcelableArrayListExtra("FieldDataList", fieldDataList);
   startActivity(intent);

My object class:

public void writeToParcel(Parcel dest, int flags) {
//Writing to parcel
}   

public static final Parcelable.Creator<FieldData> CREATOR = new Parcelable.Creator<FieldData>() {
    @Override
    public FieldData createFromParcel(Parcel in) {
        FieldData fieldData = new FieldData();
        fieldData.id = in.readInt();
        Log.i("Pracel in", ">> " + in.readString());
        fieldData.value = in.readString();
        fieldData.job_transaction_id = in.readInt();
        fieldData.field_attribute_master_id = in.readInt();           
        fieldData.required = in.readByte() != 0;
        fieldData.viewType = in.readString();
        fieldData.viewLabel = in.readString();
        fieldData.viewSubLabel = in.readString();
        fieldData.viewHelpText = in.readString();
        return fieldData;
    }

    @Override
    public FieldData[] newArray(int size) {
        Log.v("Array size", ">>> "+ size);
        return new FieldData[size];
    }
};

My way to receive data:

Intent i = getIntent();
ArrayList<FieldData> fieldDataList =  i.getParcelableArrayListExtra("FieldDataList");

This activity receives null list. I dont know what it means and what's wrong here.


Solution

  • Try to implemente Parcelable required method to read and write class field,Parcelable.Creator generate instance of your parcelable class from parcel and parcel also read-write class field value.

    public class FieldData implements Parcelable {
        private int id;
        private String value;
        private int job_transaction_id;
        private int field_attribute_master_id;
        private Byte required;
        private String viewType;
        private String viewLabel;
        private String viewSubLabel;
        private String viewHelpText;
    
        public int describeContents() {
    
            return 0;
        }
    
        public void writeToParcel(Parcel out, int flags)
        {
            out.writeInt(id);
            out.writeString(value);
            out.writeInt(job_transaction_id);
            out.writeInt(field_attribute_master_id);
            out.writeByte(required);
            out.writeString(viewType);
            out.writeString(viewLabel);
            out.writeString(viewSubLabel);
            out.writeString(viewHelpText);
        }
    
        public static final Parcelable.Creator<FieldData> CREATOR
                = new Parcelable.Creator<FieldData>() {
            public FieldData createFromParcel(Parcel in) {
                return new FieldData(in);
            }
    
            public FieldData[] newArray(int size) {
                return new FieldData[size];
            }
        };
    
        private FieldData(Parcel in) {
    
            id = in.readInt();
            value = in.readString();
            job_transaction_id = in.readInt();
            field_attribute_master_id = in.readInt();
            required = in.readByte();
            viewType = in.readString();
            viewLabel = in.readString();
            viewSubLabel = in.readString();
            viewHelpText = in.readString();
        }
    }