2015-03-06 12 views
8

Amaçları geçmem gereken Nesneler yaratan iki sınıfım var, şu anda bunu yapmak için Parcelable kullanmaya çalışıyorum. test itibarenÖzel nesnelerin ArrayList'lerini ayrıştırma Parentlable

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); 
    } 
} 

şimdiye kadar benim Öğe nesne bunu paket ne zaman doğru bilgi aktarımı gibi görünüyor.

Ancak, ikinci sınıftaki Diner'm bir Nesne listesi nesnesi içeriyor Öğe ve Parcelable'ı bu sınıfta, özellikle de yorum yaptığım kısımlarda doğru şekilde nasıl uygulayacağından emin değilim. Görüyorum ki readParsableArray() yöntemi var ancak ArrayLists için bir şey yok.

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

Parlatılabilir kodu elle yazmak hatalıdır. Android Studio/IntelliJ kullanıyorsanız, bunu yapmak için [Parcelabler] 'ı (https://github.com/dallasgutauckis/android-parcelable-intellij-plugin) kullanabilirsiniz. – Emmanuel

+0

Ne yazık ki bu bir okul proje ödevi için, bu yüzden dış eklentileri kullanarak kaşları çattı. – user3371750

+2

Profesörünüzle konuşun ve güzel bir şekilde, eğer geliştiricilerin gerçek dünyada yaptıklarını veya gitmelerini istemediklerini sorarlar. – Emmanuel

cevap

17

writeTypedList ve readTypedList kullanın.

parcel.writeTypedList(yourList); 

ve

parcel.readTypedList(yourList, YourParcelable.CREATOR); 

geri listeyi okumak için bir argüman olarak CREATOR geçmek nasıl dikkat edin.

+0

Yanıtınız için teşekkürler, ancak aşağıdaki satırı kullanmaya çalıştığımda uyumsuz tür hata iletisi alıyorum - itemList = in.readTypedList (itemList, Item.CREATOR); – user3371750

+1

@ user3371750 'readTypedList', bir dönüş türü boşluğu içeriyor, içine girdiğiniz her şeyi dolduracaktır. –

İlgili konular