Ich habe ein paar Themen durchsucht, aber keine Lösung für mein Problem gefunden.
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 meiner MainActivity habe ich eine ArrayList. Um die Liste dynamisch bearbeitbar zu machen, muss ich sie an eine andere Aktivität übergeben, 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 gibt mir Eclipse die folgende Fehlermeldung. Die Methode putParcelableArrayListExtra(String, ArrayList) im Typ Intent ist für die Argumente (String, List) nicht anwendbar.
Ist dies der richtige Weg?
ArrayList<Series> list = savedInstanceState
.getParcelableArrayList("com.example.episodetracker.listofseries");
Auf diese Weise versuche ich, die Daten in einer anderen Aktivität zu lesen.
Es stürzt in der Zeile darüber ab. nämlich der getParcelableArrayList-Teil.
1/ Ich verstehe nicht, was in Ihrem Code nicht funktioniert. 2/ Speichern Sie die Listen nicht irgendwo? Wäre es daher nicht am besten, an der Datenbank zu arbeiten, anstatt an einem Array, das Sie von Aktivität zu Aktivität übergeben?
– njzk2
28. Februar 13 um 10:38 Uhr
Parcelables sind sozusagen der Teufel … haben Sie versucht, sie stattdessen serialisierbar zu machen?
– Schneekrabben
28. Februar 13 um 14:27 Uhr
Ich hatte den Eindruck, dass Parcelable der richtige Weg ist, da Serializable viel langsamer ist?
– Adrian Jandl
28. Februar 13 um 14:31 Uhr
Parcelable erleichtert komplexe Klassen. Von wie vielen Dateneingaben sprechen wir in Bezug auf die Geschwindigkeit?
– Schneekrabben
28. Februar 13 um 14:54 Uhr
Eine ArrayList mit ~10 Einträgen, wobei jeder Eintrag 3 Memvars hat.
– Adrian Jandl
28. Februar 13 um 14:57 Uhr
Schneekrabben
Das Problem besteht darin, auf das Paket zu schreiben und aus dem Paket einzulesen …
@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 ausschreiben, muss mit dem übereinstimmen, was Sie einlesen…
@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() von zwei verschiedenen Aktivitäten. Der erste startet den zweiten; und es funktioniert gut. Ich konnte das Paket ohne Probleme ziehen.
Änderte es. Die NullPointerException bleibt jedoch bestehen. Habe in diesem Teil aber nichts geändert ` ArrayList list = savedInstanceState .getParcelableArrayList(“com.example.episodetracker.listofseries”);`
– Adrian Jandl
28. Februar 13 um 14:50 Uhr
Der Name im Bundle spielt keine Rolle, Sie könnten es “MyArray” als Schlüssel nennen und es sollte funktionieren. Auf welcher Leitung stürzt es ab?
– Schneekrabben
28. Februar 13 um 14:59 Uhr
Absturz in der Zeile, in der ich meine neue Aktivität “lade”. Insbesondere diese Zeile: ArrayList list = savedInstanceState .getParcelableArrayList(“com.example.episodetracker.listofseries”);`
– Adrian Jandl
28. Februar 13 um 15:03 Uhr
Sie müssen von der Absicht aus aufrufen, nicht von savedInstanceState
– Schneekrabben
28. Februar 13 um 15:12 Uhr
Ich habe mich eine Stunde im Kreis gedreht…bis auf die Bestellung war alles perfekt…
intent.putParcelableArrayListExtra( "com.example.episodetracker.listofseries", (ArrayList<? extends Parcelable>) listOfSeries); ist dies der richtige Weg, es zu tun? Wenn ich es nicht umsetze, erhalte ich die folgende Fehlermeldung: Die Methode putParcelableArrayListExtra(String, ArrayList) im Typ Intent ist für die Argumente (String, List) nicht anwendbar.
– Adrian Jandl
28. Februar 13 um 11:35 Uhr
erkläre deine listOfSeries wie ArrayList nicht List.
– Ovidiu Latcu
28. Februar 13 um 13:38 Uhr
Okay, das hat den Compiler glücklich gemacht. Das Programm stürzt jedoch immer noch ab, wenn ich versuche, die Daten auszulesen. Ich habe den ursprünglichen Beitrag mit einem Logcat-Snippet aktualisiert.
– Adrian Jandl
28. Februar 13 um 14:19 Uhr
Ich habe verwendet putParcelableArrayList(<? extends Parcelable>) von einem Bundle Objekt. Nicht direkt von einem Absichtsobjekt. (Ich weiß nicht wirklich, was der Unterschied ist). aber ich verwende auf diese Weise:
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 können Sie bei Ihrer neuen Aktivität die kürzlich in das Bundle-Objekt eingefügten Daten wie folgt ausfüllen:
Bundle data = this.getIntent().getBundleExtra("result.content");
ArrayList<ParcelableRow> result = data.getParcelableArrayList("search.resultset");
Denken Sie daran, dass Ihre ArrayList<> darf nur parzellierbare Gegenstände enthalten. und nur um sicherzustellen, dass Sie die Daten übergeben haben, können Sie überprüfen, ob die empfangenen Daten null sind oder nicht, nur um Probleme zu vermeiden.
Vielleicht hilft das jemandem. Sonst war mein Problem, dass ich write und readValue verwendet habe, aber es sollte mit Typen wie writeInt, readInt, writeString, readString und so weiter übereinstimmen
Zar E. Ahmer
Ich mache es auf diese Weise:
var intent = Intent(this@McqActivity,ResultActivity::class.java)
intent.putParcelableArrayListExtra("keyResults", ArrayList(resultList))
// resultList is of type mutableListOf<ResultBO>()
startActivity(intent)
Und für die Herstellung Klasse Paketierbar . Ich tue es einfach two operation zuerst habe ich verwendet @ PaketAnnotation über meiner Datenklasse und zweitens vererbe ich sie mit Parcelable Wie unten..
import kotlinx.android.parcel.Parcelize
import android.os.Parcelable
@Parcelize // Include Annotion
data class ResultBO(val questionBO: QuestionBO) : Parcelable {
constructor() : this(QuestionBO())
}
Und am empfangenden Ende
if (intent != null) {
var results = intent.getParcelableArrayListExtra<Parcelable>("keyResults")
}
1/ Ich verstehe nicht, was in Ihrem Code nicht funktioniert. 2/ Speichern Sie die Listen nicht irgendwo? Wäre es daher nicht am besten, an der Datenbank zu arbeiten, anstatt an einem Array, das Sie von Aktivität zu Aktivität übergeben?
– njzk2
28. Februar 13 um 10:38 Uhr
Parcelables sind sozusagen der Teufel … haben Sie versucht, sie stattdessen serialisierbar zu machen?
– Schneekrabben
28. Februar 13 um 14:27 Uhr
Ich hatte den Eindruck, dass Parcelable der richtige Weg ist, da Serializable viel langsamer ist?
– Adrian Jandl
28. Februar 13 um 14:31 Uhr
Parcelable erleichtert komplexe Klassen. Von wie vielen Dateneingaben sprechen wir in Bezug auf die Geschwindigkeit?
– Schneekrabben
28. Februar 13 um 14:54 Uhr
Eine ArrayList mit ~10 Einträgen, wobei jeder Eintrag 3 Memvars hat.
– Adrian Jandl
28. Februar 13 um 14:57 Uhr