【问题标题】:intent send pojo object in second activity, in second activity object get but , inside object inner list return null意图在第二个活动中发送 pojo 对象,在第二个活动对象中获取但是,在对象内部列表中返回 null
【发布时间】:2018-03-15 07:48:11
【问题描述】:

我使用意图将我的 pojo 对象从一个类发送到另一个类

它成功发送并从另一个类成功检索

但是当我从 retrive pojo 检查内部数据时 我的内部数组列表名称链接和电话返回 null; 我不知道为什么,因为我的其他数据名称和数据已填充但 arraylist 未填充

this i retrive data using intent

this i send data using intent

我的 pojo 课是

public class Datum implements Parcelable {

@SerializedName("assigned_to")
private String mAssignedTo;
@SerializedName("contact_id")
private String mContactId;
@SerializedName("created_date")
private String mCreatedDate;
@SerializedName("first_name")
private String mFirstName;
@SerializedName("img")
private String mImg;
@SerializedName("last_name")
private String mLastName;
@SerializedName("links")
private List<Link> mLinks;
@SerializedName("modified_date")
private String mModifiedDate;
@SerializedName("phone")
private List<Phone> mPhone;
@SerializedName("photo")
private String mPhoto;
@SerializedName("salutation")
private String mSalutation;
@SerializedName("subscription_id")
private String mSubscriptionId;
@SerializedName("type")
private String mType;
private boolean isChecked;

protected Datum(Parcel in) {
    mAssignedTo = in.readString();
    mContactId = in.readString();
    mCreatedDate = in.readString();
    mFirstName = in.readString();
    mImg = in.readString();
    mLastName = in.readString();
    mModifiedDate = in.readString();
    mPhoto = in.readString();
    mSalutation = in.readString();
    mSubscriptionId = in.readString();
    mType = in.readString();
    isChecked = in.readByte() != 0;
}

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

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

public boolean isChecked() {
    return isChecked;
}

public void setChecked(boolean checked) {
    isChecked = checked;
}

public String getAssignedTo() {
    return mAssignedTo;
}

public void setAssignedTo(String assignedTo) {
    mAssignedTo = assignedTo;
}

public String getContactId() {
    return mContactId;
}

public void setContactId(String contactId) {
    mContactId = contactId;
}

public String getCreatedDate() {
    return mCreatedDate;
}

public void setCreatedDate(String createdDate) {
    mCreatedDate = createdDate;
}

public String getFirstName() {
    return mFirstName;
}

public void setFirstName(String firstName) {
    mFirstName = firstName;
}

public String getImg() {
    return mImg;
}

public void setImg(String img) {
    mImg = img;
}

public String getLastName() {
    return mLastName;
}

public void setLastName(String lastName) {
    mLastName = lastName;
}

public List<Link> getLinks() {
    return mLinks;
}

public void setLinks(List<Link> links) {
    mLinks = links;
}

public String getModifiedDate() {
    return mModifiedDate;
}

public void setModifiedDate(String modifiedDate) {
    mModifiedDate = modifiedDate;
}

public List<Phone> getPhone() {
    return mPhone;
}

public void setPhone(List<Phone> phone) {
    mPhone = phone;
}

public String getPhoto() {
    return mPhoto;
}

public void setPhoto(String photo) {
    mPhoto = photo;
}

public String getSalutation() {
    return mSalutation;
}

public void setSalutation(String salutation) {
    mSalutation = salutation;
}

public String getSubscriptionId() {
    return mSubscriptionId;
}

public void setSubscriptionId(String subscriptionId) {
    mSubscriptionId = subscriptionId;
}

public String getType() {
    return mType;
}

public void setType(String type) {
    mType = type;
}



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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(mAssignedTo);
    dest.writeString(mContactId);
    dest.writeString(mCreatedDate);
    dest.writeString(mFirstName);
    dest.writeString(mImg);
    dest.writeString(mLastName);
    dest.writeString(mModifiedDate);
    dest.writeString(mPhoto);
    dest.writeString(mSalutation);
    dest.writeString(mSubscriptionId);
    dest.writeString(mType);
    dest.writeByte((byte) (isChecked ? 1 : 0));
}
}

这是我的链接 pojo

public class Link implements Parcelable {

@SerializedName("company")
private String mCompany;
@SerializedName("company_id")
private String mCompanyId;
@SerializedName("edit")
private String mEdit;
@SerializedName("id")
private String mId;
@SerializedName("img")
private String mImg;
@SerializedName("logo")
private String mLogo;
@SerializedName("record_type")
private String mRecordType;
@SerializedName("relation")
private String mRelation;

protected Link(Parcel in) {
    mCompany = in.readString();
    mCompanyId = in.readString();
    mEdit = in.readString();
    mId = in.readString();
    mImg = in.readString();
    mLogo = in.readString();
    mRecordType = in.readString();
    mRelation = in.readString();
}

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

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

public String getCompany() {
    return mCompany;
}

public void setCompany(String company) {
    mCompany = company;
}

public String getCompanyId() {
    return mCompanyId;
}

public void setCompanyId(String companyId) {
    mCompanyId = companyId;
}

public String getEdit() {
    return mEdit;
}

public void setEdit(String edit) {
    mEdit = edit;
}

public String getId() {
    return mId;
}

public void setId(String id) {
    mId = id;
}

public String getImg() {
    return mImg;
}

public void setImg(String img) {
    mImg = img;
}

public String getLogo() {
    return mLogo;
}

public void setLogo(String logo) {
    mLogo = logo;
}

public String getRecordType() {
    return mRecordType;
}

public void setRecordType(String recordType) {
    mRecordType = recordType;
}

public String getRelation() {
    return mRelation;
}

public void setRelation(String relation) {
    mRelation = relation;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(mCompany);
    dest.writeString(mCompanyId);
    dest.writeString(mEdit);
    dest.writeString(mId);
    dest.writeString(mImg);
    dest.writeString(mLogo);
    dest.writeString(mRecordType);
    dest.writeString(mRelation);
}

}

这是号码pojo

public class Phone implements Parcelable{

@SerializedName("flagecode")
private String mFlagecode;
@SerializedName("id")
private String mId;
@SerializedName("is_primary")
private String mIsPrimary;
@SerializedName("phone_type")
private String mPhoneType;
@SerializedName("phone_type_id")
private String mPhoneTypeId;
@SerializedName("value")
private String mValue;

protected Phone(Parcel in) {
    mFlagecode = in.readString();
    mId = in.readString();
    mIsPrimary = in.readString();
    mPhoneType = in.readString();
    mPhoneTypeId = in.readString();
    mValue = in.readString();
}

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

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

public String getFlagecode() {
    return mFlagecode;
}

public void setFlagecode(String flagecode) {
    mFlagecode = flagecode;
}

public String getId() {
    return mId;
}

public void setId(String id) {
    mId = id;
}

public String getIsPrimary() {
    return mIsPrimary;
}

public void setIsPrimary(String isPrimary) {
    mIsPrimary = isPrimary;
}

public String getPhoneType() {
    return mPhoneType;
}

public void setPhoneType(String phoneType) {
    mPhoneType = phoneType;
}

public String getPhoneTypeId() {
    return mPhoneTypeId;
}

public void setPhoneTypeId(String phoneTypeId) {
    mPhoneTypeId = phoneTypeId;
}

public String getValue() {
    return mValue;
}

public void setValue(String value) {
    mValue = value;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(mFlagecode);
    dest.writeString(mId);
    dest.writeString(mIsPrimary);
    dest.writeString(mPhoneType);
    dest.writeString(mPhoneTypeId);
    dest.writeString(mValue);
}

}

我发送我的数据

Intent iEditContact = new Intent(JsonParseActivity.this, EditContatctActivity.class);
                iEditContact.putExtra(Constant.intent_key_edit_contact, contact);
                startActivityForResult(iEditContact, Constant.edt_contect_request_code);

并收到

if (iContact != null && iContact.hasExtra(Constant.intent_key_edit_contact)) {
            contact = iContact.getParcelableExtra(Constant.intent_key_edit_contact);

【问题讨论】:

  • 你能分享你的 POJO 课程吗?
  • 分享你的java代码你如何将pojo发送到另一个Activty以及你如何接收。@Birju
  • 好的...如果有帮助也显示截图

标签: android android-intent parcelable


【解决方案1】:

您的Datum 模型类缺少writeList() 和阅读。这就是为什么这些字段是null。您的方法应如下所示。

 protected Datum(Parcel in) {
    this.mContactId = in.readString();
    this.mAssignedTo = in.readString();
    this.mCreatedDate = in.readString();
    this.mFirstName = in.readString();
    this.mImg = in.readString();
    this.mLastName = in.readString();
    this.mLinks = new ArrayList<Link>();
    in.readList(this.mLinks, Link.class.getClassLoader());
    this.mModifiedDate = in.readString();
    this.mPhone = new ArrayList<Phone>();
    in.readList(this.mPhone, Phone.class.getClassLoader());
    this.mPhoto = in.readString();
    this.mSalutation = in.readString();
    this.mSubscriptionId = in.readString();
    this.mType = in.readString();
    this.isChecked = in.readByte() != 0;
}

  @Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(this.mContactId);
    dest.writeString(this.mAssignedTo);
    dest.writeString(this.mCreatedDate);
    dest.writeString(this.mFirstName);
    dest.writeString(this.mImg);
    dest.writeString(this.mLastName);
    dest.writeList(this.mLinks);
    dest.writeString(this.mModifiedDate);
    dest.writeList(this.mPhone);
    dest.writeString(this.mPhoto);
    dest.writeString(this.mSalutation);
    dest.writeString(this.mSubscriptionId);
    dest.writeString(this.mType);
    dest.writeByte(this.isChecked ? (byte) 1 : (byte) 0);
}

为了便于理解和生成Parcelable,我建议你在IDE中添加Android Parcelable代码生成器插件。
GOTO Setting>Plugins>Browse Repositories> Type Parcelable

【讨论】:

  • 1) 我已经为此使用了插件...您在该代码中显示了所有类、变量和方法...它们都是由该插件创建的 2) 原因:java.lang.RuntimeException: Parcel android.os.Parcel@536bd848:在 .designingapp.pojo.Datum.(Datum.java:58) 处的偏移 516 处解组未知类型代码 3538995 重定向此行:in.readList(this.mLinks, Link.class .getClassLoader());
  • Parcel 写入和读取双重检查订单。Datum.java:58 线上的内容您能指出吗?
  • 重定向这一行:in.readList(this.mLinks, Link.class.getClassLoader());
  • 检查顺序写入和读取.....意味着我必须维护哪个结构体来声明数据...这就是我初始化 counstructer 的结构体???
  • 没有构造函数只能读写Parcel。我认为订单还可以。看看This discussion
【解决方案2】:

你必须在writeToParcel(Parcel dest, int flags)Phone(Parcel in)中初始化mLinks

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mCompany);
dest.writeString(mCompanyId);
dest.writeString(mEdit);
dest.writeTypedList(mLinks );
dest.writeString(mId);
dest.writeString(mImg);
dest.writeString(mLogo);
dest.writeString(mRecordType);
dest.writeString(mRelation);
 }

同样在构造函数中

protected Phone(Parcel in) {
mFlagecode = in.readString();
mId = in.readString();
mLinks=new List<>();
in.readTypedList(mLinks, Phone.CREATOR);
mIsPrimary = in.readString();
mPhoneType = in.readString();
mPhoneTypeId = in.readString();
mValue = in.readString();

}

这应该适用于您的情况

【讨论】:

  • 我在 @Override public void writeToParcel(Parcel dest, int flags) {dest.writeTypedList(mLinks) 中写入 Datum.java dest.writeTypedList(mPhone);} 还有 mLinks = new ArrayList(); in.readTypedList(mLinks, Link.CREATOR); mPhone = new ArrayList(); in.readTypedList(mPhone, Phone.CREATOR);在受保护的数据中(包裹在){ mLinks = new ArrayList(); in.readTypedList(mLinks, Link.CREATOR); mPhone = new ArrayList(); in.readTypedList(mPhone, Phone.CREATOR);但没有工作
  • 清理并构建您的项目或删除现有项目并从头开始创建它,如果您编辑或添加一些元素,有时 Parcelable 会产生问题
【解决方案3】:

首先抱歉,因为我的英语不好

您缺少读写链接和电话列表 只需准确编写代码 ADM 代码就可以了

添加你的构造函数

mLinks = new ArrayList<Link>();
in.readList(this.mLinks, Link.class.getClassLoader());
mPhone = new ArrayList<Phone>();
in.readList(this.mPhone, Phone.class.getClassLoader());

和 writeToParcel()

dest.writeList(mLinks);
dest.writeList(mPhone);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多