2013-03-21 23 views
11

Tôi có một giao diện IA và lớp BC rằng thực hiện chúng. Cả B và C đều thực hiện Parcelable.Android Parcelable - Viết và đọc ArrayList < IA > khi IA là một giao diện

Sau đó, tôi có phần khó khăn:

Lớp DArrayList<IA>. Tôi cần điều này quá chèn cả hai lớp B và C trong arraylist. Chúng có cùng cấu trúc nhưng mối quan hệ "IS-A" không áp dụng.

Tôi cần chuyển D từ hoạt động này sang hoạt động khác dưới dạng Bưu kiện.

Tôi đã cố gắng viết (ArrayList<IA>) in.readSerializable nhưng tôi nhận được IOException. Tôi biết rằng nếu IA không phải là một giao diện thì vấn đề là dễ dàng, nhưng tôi dường như không thể tìm ra giải pháp dễ dàng cho việc này.

Bất kỳ ý tưởng nào?

@SuppressWarnings("unchecked") 
public D (Parcel in) { 
    list = new ArrayList<IA>(); 
    (...)  
    list = (ArrayList<IA>) in.readSerializable 
    } 

@SuppressWarnings("rawtypes") 
public static final Parcelable.Creator CREATOR = 
new Parcelable.Creator() { 
    public D createFromParcel(Parcel in) { 
     return new D(in); 
    } 

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

public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel dest, int flags) { 
    (...) 
    dest.writeList(list); 
} 
+0

IA nên mở rộng Bưu kiện – njzk2

+0

và sử dụng D in.readArrayList (danh sách, Người sáng tạo)? nhưng người sáng tạo nào? –

+0

Bạn có thể đăng bất kỳ mã nào bằng phương thức Parcelable của lớp D hay không. –

Trả lời

32
@SuppressWarnings("unchecked") 
public D (Parcel in) { 
    list = new ArrayList<IA>(); 
    (...)  
    //ERROR -> list = (ArrayList<IA>) in.readSerializable 
    list = in.readArrayList(IA.class.getClassLoader()); 
} 

@SuppressWarnings("rawtypes") 
public static final Parcelable.Creator CREATOR = 
new Parcelable.Creator() { 
    public D createFromParcel(Parcel in) { 
     return new D(in); 
    } 

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

public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel dest, int flags) { 
    (...) 
    dest.writeList(list); 
} 
+0

tôi có một vấn đề tôi nghĩ rằng bạn có thể giúp đỡ. Tôi có ArrayList > mà tôi muốn viết vào bưu kiện và sau đó đọc nó trong hoạt động tiếp theo. Bạn có thể hướng dẫn cách làm điều đó không? – Gem

+0

kiểm tra điều này http://stackoverflow.com/questions/13228714/set-arraylist-hashmap-string-object-value –

+0

Cảm ơn bạn! Làm việc của nó –

1

tôi khuyên bạn nên cài đặt "Android Parcelable tạo mã" plugin. Sau đó, bạn có thể tạo hàm writeToParcel, hàm tạo chỉ đọc từ lớp bưu kiện và người tạo chỉ bằng cách nhấp vào các nút Alt+Insert.