2016-06-04 3 views
0

Ich habe eine Liste einer Klasse, die ich gemacht habe, Karte, und ich muss es an eine andere Aktivität durch eine Absicht weitergeben.Verwendung von Parcelable zum Übergeben einer Liste durch eine Absicht Put-Parameter

Ich versuche Parcelable zu implementieren, wie jemand mich vorgeschlagen hat.

Tatsache ist, dass diese Liste Objekte enthält, die Modus von anderen Klassen sind, die die Karte erweitern.

So zum Beispiel habe ich diese Garde-Klasse, die Karte erstreckt, aber wenn ich die App laufen bekomme ich diesen Fehler:

Error:(10, 19) error: constructor Card in class Card cannot be applied to given types; required: Parcel found: no arguments reason: actual and formal argument lists differ in length

Die Card-Klasse ist die folgende:

public class Card implements Parcelable{ 
private String mName; 

protected Card(Parcel in) { 
    mName = in.readString(); 
} 

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

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



public String getName(){ 
    return mName; 
} 
public void setName(String name){ 
    mName = name; 
} 

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

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

}

Ich habe implementiert zwei Methoden, die Android Studio mir gesagt hat, hinzuzufügen, und ich lassen Sie sie selbst hinzufügen, sie sind describeContents() und writeToParcel() aber wie Sie habe ich in all den anderen (insgesamt 6) Klassen dieses andere Fehler erhalten, die extendCard (und im List Ich brauche enthalten sind, über n Absicht passieren)

Dies ist stattdessen

die Garde-Klasse (die anderen 5 sind alle gleich)

public class Guard extends Card { 

public Guard(){ 
    this.setName("Guard"); 
} 

}

Was denken Sie, ist das Problem ? Wie sollte ich lösen dies und warum?

Dies ist, wie ich die intent erstellen verwaltet:

Intent intent = new Intent(this, RandomAssignment.class); 
intent.putParcelableArrayListExtra("CHARACTERS", (ArrayList<? extends Parcelable>) characters); 
startActivity(intent); 

und wie es abzurufen:

characters = this.getIntent().getParcelableArrayListExtra("CHARACTERS"); 
+0

Wo sehen Sie dieser Fehler? Sie brauchen wahrscheinlich einen anderen Konstruktor, der kein Paket als Parameter – fractalwrench

+0

Ich sehe es, wenn ich die App, das Problem ist in der Guard (und die 5 anderen) Klasse .. Ich verstehe nicht, wie sollte Ich mache diesen anderen Konstruktor @fractalwrench – FET

Antwort

0

Nun, wie von Doc

ArrayList public class ArrayList extends AbstractList implements Cloneable, Serializable, RandomAccess

Seine eindeutige ArrayList ist nicht parzellierbar.

Erstellen von CustomClass Extending ArrayList mit Parcelable implementiert. Verwenden Sie Dann ist es in Intent als putParcelableArrayListExtra

Eine weitere Option, die Sie Serializable haben, fügen Sie einfach Marker ArrayListItems

+0

Mmm Sie denken, Parcelable ist der Weg oder nicht? Wenn ja, wie sollte ich tun, was du gesagt hast? Irgendwie neu für Android – FET

+0

@ Snip3r_bow Ja. Du hast Recht. . Parcelable ist der beste Weg. Seit Parcelable hat einige Optimierung in Android für die Leistung. Serialisierung ist ein Kinderspiel. – Sush

+0

Warum bekomme ich diese Fehler mit Parcelable? Ist es der beste Weg, aber nicht für ArrayLists? – FET

0

Wenn Sie Ihre Klasse Parcel enthält Objekt einer anderen Klasse machen möchten, können Sie diese Klasse Parcel machen müssen zuerst .

Zur Liste Ihrer parcel Klasse setzen

Intent i = new Intent(this,SecondActivity.class); 
i.putParcelableArrayList("YOUR_KEY", new ArrayList<ParcelableClass>(Arraylistobject)); 

die Liste abzurufen

ArrayList<ParcelableClass> testing = this.getIntent().getParcelableArrayListExtra("Your_KEY"); 

Sie auf jeden Fall über Parcel zuerst von Official doc lesen und hier von https://guides.codepath.com/android/using-parcelable

Verwandte Themen