web-dev-qa-db-fra.com

Passer ArrayList <? implémente Parcelable> to Activity

J'ai cherché quelques sujets mais je n'ai pas trouvé de solution à mon problème. 

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

}

Dans ma MainActivity, j'ai une liste de tableaux. Pour rendre la liste modifiable de manière dynamique, je dois la passer à une autre activité où je peux la modifier.

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

Je dois lancer la liste, sinon Eclipse me donne le message d'erreur suivant . La méthode putParcelableArrayListExtra (String, ArrayList) du type Intent ne s'applique pas aux arguments (String, List)

Est-ce la bonne façon de le faire?

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

C’est ainsi que j’essaie de lire les données d’une autre activité.

Il s'écrase sur la ligne ci-dessus. à savoir la partie getParcelableArrayList. 

29
Adrian Jandl
  • Le problème réside dans l'écriture sur le colis et la lecture du colis ...

    @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();
    }
    
  • Ce que vous écrivez doit correspondre à ce que vous avez lu dans ... 

    @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");
     }
    }
    
  • Le code ci-dessus a onCreate () de deux activités différentes. Le premier lance le second; et cela fonctionne bien j'ai pu tirer le colisable sans problème. 

37
snowCrabs

Vous devez utiliser la méthode putParcelableArrayListExtra() sur la classe Intent.

3
Ovidiu Latcu

J'ai utilisé putParcelableArrayList(<? extends Parcelable>) à partir d'un objet Bundle. Pas directement d'un objet d'intention (je ne sais pas vraiment quelle est la différence). mais j'utilise de cette façon:

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

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

Plus tard, lors de votre nouvelle activité, vous pourrez renseigner les données récemment insérées sur l’objet Bundle, comme suit:

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

Rappelez-vous simplement que votre ArrayList<> ne doit contenir que des objets pouvant être parcellisés. et juste pour vous assurer que vous avez transmis les données, vous pouvez vérifier si les données reçues sont nulles ou non, simplement pour éviter les problèmes.

3
AXSM

Peut-être que cela aide quelqu'un… sinon mon problème était que j'utilisais write et readValue, mais il devait correspondre à un type comme writeInt, readInt writeString, readString, etc.

0
Peter Isberg

Je le fais de cette façon:

var intent = Intent(this@McqActivity,ResultActivity::class.Java)
intent.putParcelableArrayListExtra("keyResults", ArrayList(resultList)) 
// resultList  is of type mutableListOf<ResultBO>()  
 startActivity(intent)

Et pour rendre la classe Parcelable . Je fais simplement two operation d’abord j’ai utilisé @Parcelize Annotation au-dessus de ma classe de données et deuxièmement je l’hérite avec Parcelable comme ci-dessous ..

import kotlinx.Android.parcel.Parcelize
import Android.os.Parcelable

@Parcelize // Include Annotion 
data class ResultBO(val questionBO: QuestionBO) : Parcelable {
    constructor() : this(QuestionBO())
}

Et à la fin de réception

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