2

这个错误让我发疯

这是传递参数的代码:

Intent intent = new Intent(this, TheClass.class);
Bundle bundle = new Bundle();
bundle.putInt("int_value",1);
bundle.putParcelableArrayList("USER_ARR",arr);
intent.putExtras(bundle);
startActivity(intent);

arr 是 ArrayList 并且 User 是 parcellable

另一边是:

Bundle bundle = this.getIntent().getExtras();
ArrayList<User> users = bundle.getParcelableArrayList("USER_ARR");
int int_value = bundle.getInt("int_value");

我也尝试关注这个链接:Problems passing integer and serializable on bundle and do it without bundles, but still can't get it to work the integer is not pass, unless it is passed without the paracellable array list

编辑:

用户类如下所示:

public class User implements Comparable<User>, Parcelable{

private int user_id;
private String name;
private String status;
private String phone;
private byte[] picture;
private Timestamp last_login;
private boolean is_verified;

public User(int user_id) {
    this.setUserId(user_id);
}


public int getUserId() {
    return user_id;
}

public void setUserId(int user_id) {
    this.user_id = user_id;
}

public String getName() {
    return name;
}

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

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public String getPhone() {
    return phone;
}


public void setPhone(String phone) {
    this.phone = phone;
}

public byte[] getPicture() {
    return picture;
}

public void setPicture(byte[] picture) {
    this.picture = picture;
}


public Timestamp getLastLogin() {
    return last_login;
}


public void setLastLogin(Timestamp last_login) {
    this.last_login = last_login;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + user_id;
    return result;
}


@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    User other = (User) obj;
    if (user_id != other.user_id)
        return false;
    return true;
}


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


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

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

    @Override
    public User[] newArray(int size) {
        return new User[size];
    }
};
public User(Parcel source){
    readFromParcel(source);
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(user_id);
    dest.writeString(name);
    dest.writeString(status);
    dest.writeString(phone);
    if (picture != null)
        dest.writeByteArray(picture);
    if (last_login == null)
        dest.writeString(null);
    else 
        dest.writeString(last_login.toString());
}

public void readFromParcel(Parcel source){
    user_id = source.readInt();
    name = source.readString();
    status = source.readString();
    phone = source.readString();
    if (picture != null)
        source.readByteArray(picture);
    String login = source.readString();
    if (login != null)
        last_login = Timestamp.valueOf(login);
    else 
        last_login = null;
}

public boolean contains(CharSequence str, Locale locale) {
    str = ((String)str).toLowerCase(locale);

    String name = this.getName();
    if (name != null)
        name = name.toLowerCase(locale);

    String phone = this.getPhone();
    if (phone != null)
        phone = phone.toLowerCase(locale);

    if (name != null && name.contains(str)) {
        return true;
    }
    if (phone != null && phone.contains(str)) {
        return true;
    }

    return false;
}


@Override
public int compareTo(User another) {
    String name1 = this.getName();
    String name2 = another.getName();

    return name1.compareTo(name2);
}


@Override
public String toString() {
    return "User [user_id=" + user_id + ", name=" + name + ", status="
            + status + ", phone=" + phone + ", last_login=" + last_login
            + ", is_verified=" + is_verified + "]";
}


public boolean getIsVerified() {
    return is_verified;
}


public void setIsVerified(boolean is_verified) {
    this.is_verified = is_verified;
}


}
4

1 回答 1

0

发现发生了什么,这与我问的一个较新的问题有关,该问题也没有任何答案

问题是:parcelable ArrayList 部分传递了空元素

只有当字节数组的大小大于零时,我才在我的 parcelable 中读取字节数组,但不读取它并没有推进 dataPosition()

感谢这个问题Make custom Parcelable contains byte array我找到了答案

祝大家有美好的一天

于 2013-08-29T08:20:10.237 回答