Domanda

I have a wrapper class which implements the Parcelable interface. I'm using this wrapper to pass an ArrayList between activities. It's working fine but one int field is always giving 0 when retrieving the ArrayList in another activity. Please find my code below. What am I doing wrong? Are there any size limitations?

import android.os.Parcel;
import android.os.Parcelable;

public class ModelDeviceDetails implements Parcelable{
    String responseCode;
    String nickName;
    float latitude;
    float longitude;
    String deviceName;
    String uniqueId;
    String batLevel;
    int usedChaseModes;
    int plannedChaseModes;
    int usedLocateNow;
    int plannedLocateNow;

    public ModelDeviceDetails() {}

    public ModelDeviceDetails(Parcel source) {
        deviceName = source.readString();
        uniqueId = source.readString();
        nickName = source.readString();
        latitude = source.readFloat();
        longitude = source.readFloat();
        batLevel = source.readString();
        usedChaseModes = source.readInt();
        plannedChaseModes = source.readInt();
        usedLocateNow = source.readInt();
        plannedLocateNow = source.readInt();
        responseCode = source.readString();
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.deviceName);
        dest.writeString(this.uniqueId);
        dest.writeString(this.nickName);
        dest.writeFloat(this.latitude);
        dest.writeFloat(this.longitude);    
        dest.writeString(this.batLevel);
        dest.writeInt(this.usedChaseModes);
        dest.writeInt(this.usedLocateNow);
        dest.writeInt(this.plannedChaseModes);
        dest.writeInt(this.plannedLocateNow);
        dest.writeString(this.responseCode);
    }

    public static final Parcelable.Creator<ModelDeviceDetails> CREATOR = new Creator<ModelDeviceDetails>() {

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

        @Override
        public ModelDeviceDetails createFromParcel(Parcel source) {
            return new ModelDeviceDetails(source);
        }
    };
}


I'm passing the ArrayList as follows in my main activity.

listViewActivity.putParcelableArrayListExtra("devices",devices);


Retrieving the list in my listViewActivity,

deviceList = intent.getParcelableArrayListExtra("devices");


I checked before sending the list and all the fields are populated correctly. In the listViewActivity also other fields are there correctly. But only one field always giving 0(I guess it's giving default for int). Please suggest any other approach.

È stato utile?

Soluzione

public ModelDeviceDetails(Parcel source) {
    deviceName = source.readString();
    uniqueId = source.readString();
    nickName = source.readString();
    latitude = source.readFloat();
    longitude = source.readFloat();
    batLevel = source.readString();
    usedChaseModes = source.readInt();
    plannedChaseModes = source.readInt(); // <-------- this
    usedLocateNow = source.readInt(); // <-------- and this
    plannedLocateNow = source.readInt();
    responseCode = source.readString();
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(this.deviceName);
    dest.writeString(this.uniqueId);
    dest.writeString(this.nickName);
    dest.writeFloat(this.latitude);
    dest.writeFloat(this.longitude);    
    dest.writeString(this.batLevel);
    dest.writeInt(this.usedChaseModes);
    dest.writeInt(this.usedLocateNow);
    dest.writeInt(this.plannedChaseModes);
    dest.writeInt(this.plannedLocateNow);
    dest.writeString(this.responseCode);
}

If you implement Parcable in your class right, then you can send:

ArrayList<ModelDeviceDetails> list = new ArrayList<ModelDeviceDetails>();
list.add(new ModelDeviceDetails(...));
list.add(new ModelDeviceDetails(...));
Intent mySendingActivity = new Intent(getApplicationContext(), MySendingActivity.class);
mySendingActivity.putParcelableArrayListExtra("details", list);

And get its in your activity:

Bundle b = getIntent().getExtras();
ArrayList<ModelDeviceDetails> l = b.getParcelableArrayList("details");
Log.i("MySendingActivity", "Details:" + l);

Altri suggerimenti

No way I found to resolve this and managed it with Serializable instead of Parcelable.
Wrapper Class

import java.io.Serializable;

public class DeviceDetails implements Serializable {
    private static final long serialVersionUID = 1L;
    public DeviceDetails(){

    }
    String responseCode;    
    String nickName;
    float latitude;
    float longitude;
    String deviceName;
    String uniqueId;
    String batLevel;
    int usedChaseModes;
    int plannedChaseModes;
    int usedLocateNow;
    int plannedLocateNow;

    //getters and setters
}

Sending info

Intent intent = new Intent(getApplicationContext(), MySendingActivity.class);
Bundle mBundle = new Bundle();
mBundle.putSerializable("myKey", deviceDetails);
intent.putExtras(mBundle);              
startActivity(intent);

above deviceDetails is of type ArrayList<DeviceDetails>.

Receiving info

ArrayList<DeviceDetails> deviceList = (ArrayList<DeviceDetails>) intent.getSerializableExtra("myKey");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top