Parcelable ArrayList始终为空

时间:2016-04-12 14:53:54

标签: android parameters parcelable

我想通过ArrayListIntent传递给另一个活动。但是,代码不会给出任何错误,但List始终为空。知道我做错了什么吗? TY

活性1

 private ArrayList<ResimBean> rbList = new ArrayList<ResimBean>();



                Bitmap bmp = (Bitmap) data.getExtras().get("data");
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
                byte[] thumbArray = stream.toByteArray();
                 Uri selectedImageUri = data.getData();
                String fotopath = getRealPathFromURI(selectedImageUri);
                ResimBean rb = new ResimBean(Parcel.obtain());
               // rb.setResim(bar);
                rb.setThumbnail(thumbArray);
                rb.setPath(fotopath);
                rbList.add(rb);
     Intent intent = new Intent(getApplicationContext(), ResimListActivity.class);
     intent.putParcelableArrayListExtra("reslist",rbList);
     startActivityForResult(intent, 100);

活性2

Bundle extras = getIntent().getExtras();
if (extras != null) {
    try {
       Intent i = getIntent();
       ArrayList<ResimBean> rbList = i.getParcelableArrayListExtra("reslist");
    } catch (Exception ex) {
      String msg = ex.getMessage(); 
    }
}

它没有给出任何错误,但列表总是空的。

修改

添加了我填写列表的代码。

编辑2 我的Parcelable类有什么问题或什么?

 public class ResimBean implements Parcelable {
 private int Id;
 private int HataBildirimId;
 private byte[] Resim;
 private byte[] Thumbnail;
 public byte[] getThumbnail() {
    return Thumbnail;
}

public void setThumbnail(byte[] thumbnail) {
    Thumbnail = thumbnail;
}

private String Path;

public String getPath() {
    return Path;
}

public void setPath(String path) {
    Path = path;
}

public int getHataBildirimId() {
    return HataBildirimId;
}

public void setHataBildirimId(int hataBildirimId) {
    HataBildirimId = hataBildirimId;
}

public int getId() {
    return Id;
}

public void setId(int id) {
    Id = id;
}

public byte[] getResim() {
    return Resim;
}

public void setResim(byte[] resim) {
    Resim = resim;
}
@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(HataBildirimId);
    dest.writeByteArray(Resim);
    dest.writeByteArray(Thumbnail);

}
public ResimBean(Parcel in) {
    readFromParcel(in);
}

public void readFromParcel(Parcel in){
    this.HataBildirimId = in.readInt();
    this.Resim = new byte[in.readInt()];
    this.Thumbnail = new byte[in.readInt()];
}

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

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

2 个答案:

答案 0 :(得分:0)

您可以按照本教程操作: http://aryo.lecture.ub.ac.id/android-passing-arraylist-of-object-within-an-intent/

我让它像这样工作

Bundle extras = this.getIntent().getExtras();
        if (extras != null) {
            try {
                Intent i = getIntent();
                ArrayList<ResimBean> rbList = (ArrayList<ResimBean>) i.getExtras().get("reslist");
                Log.i("mytag", " "+i.getExtras().get("reslist").toString());
                Log.i("mytag", " "+rbList.get(0).toString());
            } catch (Exception ex) {
                String msg = ex.getMessage();
            }
        }

使用Activity2中的rbList size = 1, 使用您的代码我得到size = 0

答案 1 :(得分:0)

您正在展示的方式,您创建一个新的ArrayList&lt;&gt;并通过意图将其作为额外的空白发送给下一个活动。

你究竟在哪里填充ArrayList?

你应该这样做:

private ArrayList<ResimBean> rbList = new ArrayList<ResimBean>();

//populate rbList using adapter, then call intent

Intent intent = new Intent(getApplicationContext(), ResimListActivity.class);
intent.putParcelableArrayListExtra("reslist",rbList);
startActivityForResult(intent, 100);

否则,您作为额外发送的rbList将始终为空。这听起来很明显,但我不知道你是怎么做的,所以这是我最好的猜测。