2013-05-08 3 views
1

Parcelable을 통해 오브젝트 배열을 전달하려고합니다. 그러나 전송 한 후, 데이터는 이상한로 변환오브젝트의 분해 가능한 arraylist를 전달하려면

송신 부분 :

for (int i=0; i<res.size(); i++) { 
       Log.d(LOG_TAG, "id = "+res.get(i).id+" weigth = "+res.get(i).weight); 
      } 

      ParcelableProducts Checked = new ParcelableProducts(); 
      Checked.setList(res); 
      intent.putExtra(ParcelableProducts.class.getCanonicalName(), Checked); 

수신 부분 :

ParcelableProducts res = (ParcelableProducts) data.getParcelableExtra(ParcelableProducts.class.getCanonicalName()); 
      ArrayList<prProduct> prod = res.prod; 
      for (int i=0; i<prod.size(); i++) { 
       Log.d(LOG_TAG, "id = "+prod.get(i).id+" weigth = "+prod.get(i).weight); 
      } 

클래스의 ArrayList와 Parcelable :

public class ParcelableProducts implements Parcelable { 
    final private static String LOG_TAG = "ParcelableProducts"; 
    public ArrayList<prProduct> prod; 

    public ParcelableProducts() { 
     prod = new ArrayList<prProduct>(); 
    } 

    public void setList(ArrayList<prProduct> _prod){ 
     prod = _prod; 
    } 

    public ArrayList<prProduct> getList() { 
     return prod; 
    } 

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

    @Override 
    public void writeToParcel(Parcel parcel, int flags) { 
     parcel.writeList(prod); 
    } 
    public static final Parcelable.Creator<ParcelableProducts> CREATOR = new Parcelable.Creator<ParcelableProducts>() { 
     public ParcelableProducts createFromParcel(Parcel in) { 
      return new ParcelableProducts(in); 
     } 

     public ParcelableProducts[] newArray(int size) { 
      return new ParcelableProducts[size]; 
     } 
     }; 

     private ParcelableProducts(Parcel parcel) { 
     prod = new ArrayList<prProduct>(); 
     parcel.readTypedList(prod, prProduct.CREATOR); 
     } 
} 

및 prProduct :

전송 : 로그

public class prProduct implements Parcelable { final static String LOG_TAG = "prProduct"; public float weight; public int id; public prProduct(int _id, Float _weight) { weight = _weight; id = _id; } public int describeContents() { return 0; } public void writeToParcel(Parcel parcel, int flags) { parcel.writeFloat(weight); parcel.writeInt(id); } public static final Parcelable.Creator<prProduct> CREATOR = new Parcelable.Creator<prProduct>() { public prProduct createFromParcel(Parcel in) { return new prProduct(in); } public prProduct[] newArray(int size) { return new prProduct[size]; } }; private prProduct(Parcel parcel) { weight = parcel.readFloat(); id = parcel.readInt(); } } 

ID = 7 weigth = 0.0

받아 봐 : ID = 7,602,278 weigth = 4.2E-44 핸드 오프

+0

'prProduct' 클래스가 더 복잡해지지 않으면'Parcelable' 대신'Serializable'으로 바꾸지 않으시겠습니까? 'ArrayList' 또한'Serializable'이기 때문에 모든 것이 잘 작동합니다. 이것이 옵션인지 알려 주시면 어떻게하는지 자세히 설명하는 답변을 게시하겠습니다. – MCeley

+0

소포를 만든 직후에 소포 읽기를 시도하십시오. 문제를 지역화하는 데 도움이됩니다. 소포 읽기/작성 또는 활동간에 소포를 전송하는 것입니까? – tbkn23

+0

MCeley, 하나의 실수와 하나의 실수를 전달해야합니다. – ftp27

답변

4

I 그렇지 전송시 데이터가 손상되는 곳을 확인하십시오.하지만 코드를 정리하는 데 도움이됩니다. 개인적으로 나는 가독성을 높이기 위해 내 코드를 리팩터링 할 때 과거에 많은 이상한 버그를 고쳤다. 먼저 "ParcelableProducts"클래스를 제거해야합니다. 필요하지 않기 때문입니다. putParcelableArrayListExtra 메서드를 사용하여 직접 Intent에 ArrayList를 전달하면됩니다. Shown here.

이 또한 조금 까다 롭지 만 직접 필드에 액세스하면 안됩니다. 개인용으로 설정하고 getter/setter를 사용하는 것이 좋습니다. 또한 로깅 문에 대한 각 루프마다를 사용하면 조금 더 깨끗합니다.

보다 안전한 PrProduct 클래스입니다.

//Java classes should start with capital letter 
public class PrProduct implements Parcelable { 
    private final static String LOG_TAG = "PrProduct"; 

    private float weight; 
    private int id; 

    public prProduct(int id, float weight) { 
     this.weight = weight; 
     this.id = id; 
    } 
    //Using getters only makes this immutable which is safer since the 
    //weight/id aren't likely to change. 
    public float getWeight(){ 
     return weight;} 
    public int getId(){ 
     return id;} 

    public int describeContents() { 
     return 0; 
    } 

    public void writeToParcel(Parcel parcel, int flags) { 
     parcel.writeFloat(weight); 
     parcel.writeInt(id); 
    } 

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

     public prProduct[] newArray(int size) { 
     return new prProduct[size]; 
     } 
    }; 

    private prProduct(Parcel parcel) { 
     weight = parcel.readFloat(); 
     id = parcel.readInt(); 
    } 
} 

//A sample for each loop 
for(PrProduct product: prod) 
    Log.d(LOG_TAG, "weight=" + product.getWeight() + " id=" + product.getId()); 
0

왜 객체 Parcelable를 구현 ParcelableProducts를 작성해야합니까? 내 생각에 당신은 직접적으로 putParcelableArrayListExtra 메서드를 사용하여 arraylist를 전달할 수 있다고 생각하십니까?

관련 문제