webentwicklung-frage-antwort-db.com.de

ArrayList übergeben <? implementiert Parcelable> zu Activity

Ich habe einige Themen gesucht, 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 editierbar 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 umsetzen, andernfalls gibt Eclipse die folgende Fehlernachricht aus Die Methode putParcelableArrayListExtra (String, ArrayList) vom 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 auf der Linie oben ab. nämlich der getParcelableArrayList-Part. 

29
Adrian Jandl
  • Das Problem besteht darin, auf das Paket zu schreiben und vom 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 schreiben, muss mit dem übereinstimmen, was Sie gelesen haben ... 

    @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 enthält onCreate () aus zwei verschiedenen Aktivitäten. Der erste startet den zweiten; und es funktioniert gut ich konnte das Paket ohne Probleme ziehen. 

37
snowCrabs

Sie sollten die putParcelableArrayListExtra() -Methode für die Intent-Klasse verwenden.

3
Ovidiu Latcu

Ich habe putParcelableArrayList(<? extends Parcelable>) aus einem Bundle-Objekt verwendet. Nicht direkt von einem Absichtsobjekt (ich weiß nicht wirklich, was der Unterschied ist). aber ich benutze 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 Ihre neuen Aktivitäten mit den Daten füllen, die kürzlich in das Bundle-Objekt eingefügt wurden:

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

Denken Sie daran, dass Ihr ArrayList<> nur Parcelable-Objekte enthalten darf. Und nur um sicherzustellen, dass Sie die Daten übermittelt haben, überprüfen Sie möglicherweise, ob die empfangenen Daten null sind oder nicht, um Probleme zu vermeiden.

3
AXSM

Vielleicht hilft dies jemandem. Ansonsten war mein Problem, dass ich write und readValue verwendet habe, aber es sollte mit dem Typ writeInt, readInt writeString, readString usw. übereinstimmen

0
Peter Isberg

Ich mache es auf diese Weise:

var intent = Intent([email protected],ResultActivity::class.Java)
intent.putParcelableArrayListExtra("keyResults", ArrayList(resultList)) 
// resultList  is of type mutableListOf<ResultBO>()  
 startActivity(intent)

Und um die Klasse Parcelable zu machen. Ich mache einfach two operation zuerst benutzte ich @Parcelize Annotation über meiner Datenklasse und zweitens erbe ich es 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 Empfangsende

if (intent != null) {
     var results = intent.getParcelableArrayListExtra<Parcelable>("keyResults")
}
0
Xar E Ahmer