2013-02-28 7 views
19

Ich habe ein paar Themen durchsucht, aber keine Lösung für mein Problem gefunden.Pass ArrayList <? implementiert Parcelable> zu Aktivität

public class Series implements Parcelable { 
private String name; 
private int numOfSeason; 
private int numOfEpisode; 

/** Constructors and Getters/Setters have been removed to make reading easier **/ 

public Series(Parcel in) { 
    String[] data = new String[3]; 
    in.readStringArray(data); 
    this.name = data[0]; 
    this.numOfSeason = Integer.parseInt(data[1]); 
    this.numOfEpisode = Integer.parseInt(data[2]); 
} 


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

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeStringArray(new String[] { this.name, 
      String.valueOf(this.numOfSeason), 
      String.valueOf(this.numOfEpisode) }); 

} 

private void readFromParcel(Parcel in) { 
    name = in.readString(); 
    numOfSeason = in.readInt(); 
    numOfEpisode = in.readInt(); 
} 

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
    @Override 
    public Series createFromParcel(Parcel in) { 
     return new Series(in); 
    } 

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

}

In meinem MainActivity habe ich eine Arraylist. Um die Liste dynamisch editierbar zu machen, muss sie an eine andere Aktivität übergeben werden, wo ich sie bearbeiten kann.

ArrayList<Series> listOfSeries = new ArrayList<Series>(); 

    public void openAddActivity() { 
    Intent intent = new Intent(this, AddActivity.class); 
    intent.putParcelableArrayListExtra(
      "com.example.episodetracker.listofseries", 
      (ArrayList<? extends Parcelable>) listOfSeries); 
    startActivity(intent); 
} 

Ich muss die Liste umwandeln, sonst Eclipse gibt mir die folgende Fehlermeldung. Verfahren putParcelableArrayListExtra (String, Arraylist) in der Art Intent ist für die Argumente (String, List) nicht anwendbar

Ist dies der richtige Weg, es zu tun?

ArrayList<Series> list = savedInstanceState 
      .getParcelableArrayList("com.example.episodetracker.listofseries"); 

So versuche ich, die Daten in einer anderen Aktivität zu lesen.

Es stürzt auf der Linie oben ab. nämlich der getParcelableArrayList Teil.

+0

1/Ich verstehe nicht, was nicht funktioniert in deinem Code. 2/Speichern Sie die Listen nicht irgendwo? Wäre es daher nicht besser, an der Datenbank zu arbeiten als an einem Array, das Sie von Aktivität zu Aktivität weitergeben? – njzk2

+0

Parcelables sind der Teufel sozusagen ... hast du versucht, es Serializable stattdessen machen? – snowCrabs

+1

Ich hatte den Eindruck, dass Parcelable der Weg ist, da Serializable viel langsamer ist? –

Antwort

28
  • Das Problem in schriftlicher Form, um das Paket ist und in der Sendung zu lesen ...

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
        dest.writeString(name); 
        dest.writeInt(numOfSeason); 
        dest.writeInt(numOfEpisode); 
    } 
    
    private void readFromParcel(Parcel in) { 
        name = in.readString(); 
        numOfSeason = in.readInt(); 
        numOfEpisode = in.readInt(); 
    } 
    
  • Was Sie schreiben, muss dem entsprechen, was Sie in lesen ...

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    
    Intent i = new Intent(this,SecondActivity.class); 
    
    ArrayList<testparcel> testing = new ArrayList<testparcel>(); 
    
    i.putParcelableArrayListExtra("extraextra", testing); 
    startActivity(i); 
    } 
    
        /**********************************************/ 
    
    
    public class SecondActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    
        ArrayList<testparcel> testing = this.getIntent().getParcelableArrayListExtra("extraextra"); 
    } 
    } 
    
  • Der obige Code hat onCreate() aus zwei verschiedenen Aktivitäten. Der erste startet den zweiten; und es funktioniert gut Ich war in der Lage, die Parcelable ohne Problem zu ziehen.

+0

hat es geändert. Die NullPointerException bleibt jedoch bestehen. Habe nichts in diesem Teil obwohl 'Arraylist Liste geändert = savedInstanceState .getParcelableArrayList („com.example.episodetracker.listofseries“);' –

+0

Der Name es im Bündel nicht wirklich wichtig, man könnte es nennen "MyArray" als Schlüssel und es sollte funktionieren. In welcher Linie stürzt es ab? – snowCrabs

+0

Absturz auf der Linie, wo ich in meiner neuen Aktivität "lade". Speziell diese Zeile: ArrayList list = savedInstanceState .getParcelableArrayList ("com.example.episodetracker.listofseries"); ' –

2

Sie sollten die putParcelableArrayListExtra() Methode in der Intent Klasse verwenden.

+0

'intent.putParcelableArrayListExtra (\t \t "com.example.episodetracker.listofseries"(Arraylist) listOfSeries );' ist dies der richtige Weg, es zu tun? Wenn ich es nicht umwandeln, erhalte ich die folgende Fehlermeldung: ** Die Methode putParcelableArrayListExtra (String, ArrayList ) in der Art Intent ist nicht anwendbar für die Argumente (String, Liste ) ** –

+9

deklariere deine 'listOfSeries' als' ArrayList' und nicht 'List'. –

+1

Okay, das hat den Compiler glücklich gemacht. Allerdings stürzt das Programm immer noch ab, wenn ich versuche, die Daten zu lesen. Ich habe den ursprünglichen Post mit einem Logcat-Snippet aktualisiert. –

3

Ich habe putParcelableArrayList(<? extends Parcelable>) von einem Bundle Objekt verwendet. Nicht direkt von einem Intent-Objekt (ich weiß nicht wirklich, was der Unterschied ist). aber ich benutze auf diese Weise zu nutzen:

ArrayList<ParcelableRow> resultSet = new ArrayList<ParcelableRow>(); 
resultSet = loadData(); 

Bundle data = new Bundle(); 
data.putParcelableArrayList("search.resultSet", resultSet); 
yourIntent.putExtra("result.content", data); 
startActivity(yourIntent); 

Später Ihre neue Tätigkeit Sie die Daten auf dem Bundle-Objekt wie folgt vor kurzem eingeführt bevölkern können:

Bundle data = this.getIntent().getBundleExtra("result.content"); 
ArrayList<ParcelableRow> result = data.getParcelableArrayList("search.resultset"); 

Denken Sie daran, dass Ihre ArrayList<> darf nur enthalten parzellierbare Objekte. und nur um sicherzustellen, dass Sie die Daten weitergegeben haben, können Sie überprüfen, ob die empfangenen Daten ungültig sind oder nicht, um Probleme zu vermeiden.

0

Vielleicht hilft das jemand .. sonst mein Problem war, dass ich verwenden Schreib- und Readvalue aber es sollte Typen wie writeInt, readInt write, Readstring entsprechen und so weiter

Verwandte Themen