2015-03-06 18 views
8

Tôi có hai lớp tạo đối tượng mà tôi cần truyền qua các ý định, tôi hiện đang cố gắng thực hiện Parcelable để thực hiện việc này.Làm ArrayList của các đối tượng tùy chỉnh có thể chuyển đổi

import android.os.Parcel; 
import android.os.Parcelable; 

public class Item implements Parcelable { 

    private String name; 
    private double price; 
    private int buyerCount = 0; 

    public Item(String name, double price) { 
     this.name = name; 
     this.price = price; 
    } 

    private Item(Parcel in) { 
     name = in.readString(); 
     price = in.readDouble(); 
    } 

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

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

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

    public double getPrice() { 
     return price; 
    } 

    public int getBuyerCount() { 
     return buyerCount; 
    } 

    public void incrementBuyerCount() { 
     buyerCount += 1; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(name); 
     dest.writeDouble(price); 
    } 
} 

Từ thử nghiệm cho đến nay đối tượng Mục của tôi có vẻ chuyển thông tin chính xác khi tôi gói.

Tuy nhiên, lớp học thứ hai của tôi chứa một ArrayList của các đối tượng Item và tôi không chắc chắn làm thế nào để thực hiện đúng Parcelable trong lớp này, đặc biệt trong các phần mà tôi đã nhận xét. Tôi thấy có một phương thức readParsableArray() nhưng không có gì cho ArrayLists.

import android.os.Parcel; 
import android.os.Parcelable; 

import java.util.ArrayList; 

public class Diner implements Parcelable { 

    private String name; 
    private ArrayList<Item> itemList = new ArrayList<Item>(); 

    public Diner(String name) { 
     this.name = name; 
    } 

    private Diner(Parcel in) { 
     name = in.readString(); 
     // How to read in ArrayList itemList of item objects? 
     itemList = in.readParcelableArray(); 
    } 

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

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

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(name); 
     // How to write ArrayList itemList of item objects? 
     dest.writeParcelableArray(itemList); 
    } 

    public void addItem(Item foodItem) { 
     itemList.add(foodItem); 
     foodItem.incrementBuyerCount(); 
    } 

    public double getPrice() { 
     double total = 0; 
     for(Item item : itemList) { 
      total += item.getPrice()/item.getBuyerCount(); 
     } 
     return total; 
    } 

    public String toString() { 
     return name; 
    } 

} 
+1

Viết mã có thể đặt hàng bằng tay là dễ bị lỗi. Nếu bạn đang sử dụng Android Studio/IntelliJ, bạn có thể sử dụng [Parcelabler] (https://github.com/dallasgutauckis/android-parcelable-intellij-plugin) để làm điều đó cho bạn. – Emmanuel

+0

Thật không may này là dành cho một nhiệm vụ dự án trường học, do đó tôi tin rằng bằng cách sử dụng các plugin bên ngoài được cau mày. – user3371750

+2

Hãy nói với bạn giáo sư của bạn và một cách tốt đẹp hỏi anh ta/cô ấy nếu họ muốn bạn làm theo cách mà các nhà phát triển làm điều đó trên thế giới thực hay không. – Emmanuel

Trả lời

17

Sử dụng writeTypedListreadTypedList.

parcel.writeTypedList(yourList); 

parcel.readTypedList(yourList, YourParcelable.CREATOR); 

Thông báo như thế nào bạn vượt qua trong CREATOR như một cuộc tranh cãi cho việc đọc danh sách phía sau.

+0

Cảm ơn bạn đã phản hồi, tuy nhiên tôi nhận được thông báo lỗi loại không tương thích khi tôi cố gắng sử dụng dòng sau - itemList = in.readTypedList (itemList, Item.CREATOR); – user3371750

+1

@ user3371750 'readTypedList' có loại trả về khoảng trống, nó sẽ điền vào bất kỳ danh sách nào bạn chuyển vào đó. –

Các vấn đề liên quan