34

I have searched a few topics but not found a solution to my problem.

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 my MainActivity I have an ArrayList. To make the list dynamically editeable I need to pass it to another activity where I can edit it.

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

I need to cast the list, otherwise Eclipse gives me the following Error message. The method putParcelableArrayListExtra(String, ArrayList) in the type Intent is not applicable for the arguments (String, List)

Is this the correct way to do it?

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

This is the way I try to read the data in another activity.

It's crashing on the line above. namely the getParcelableArrayList part.

Adrian Jandl
  • 2,985
  • 4
  • 23
  • 30
  • 1/ i don't understand what doesn't work in your code. 2/ don't you save the lists somewhere ? therefore, wouldn't it be best to work on the database rather than on an array you pass from activity to activity ? – njzk2 Feb 28 '13 at 10:38
  • Parcelables are the devil so to speak... have you tried making it Serializable instead? – snowCrabs Feb 28 '13 at 14:27
  • 1
    I was under the impression that Parcelable is the way to go since Serializable is a lot slower ? – Adrian Jandl Feb 28 '13 at 14:31
  • Parcelable makes it easier for complex classes. As far as speed goes how many data entries are we talking about? – snowCrabs Feb 28 '13 at 14:54
  • An ArrayList with ~10 entries, where each entry has 3 memvars. – Adrian Jandl Feb 28 '13 at 14:57

6 Answers6

42
  • The problem is in writing out to the parcel and reading in from the parcel ...

    @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();
    }
    
  • What you write out has to match what you read in...

    @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");
     }
    }
    
  • The above code is having onCreate() from two different activities. The first one launches the second one; and it works fine I was able to pull the parcelable without issue.

Narendra Singh
  • 3,990
  • 5
  • 37
  • 78
snowCrabs
  • 785
  • 5
  • 11
  • Changed it. However the NullPointerException remains. Haven't changed anything in this part though ` ArrayList list = savedInstanceState .getParcelableArrayList("com.example.episodetracker.listofseries");` – Adrian Jandl Feb 28 '13 at 14:50
  • The name of it in the bundle doesn't really matter you could call it "MyArray" as the key and it should work. What line is it crashing on? – snowCrabs Feb 28 '13 at 14:59
  • Crashing on the line where I "load" in my new activity. Specifically this line: ArrayList list = savedInstanceState .getParcelableArrayList("com.example.episodetracker.listofseries");` – Adrian Jandl Feb 28 '13 at 15:03
  • 1
    You have to call from the the intent not the savedInstanceState – snowCrabs Feb 28 '13 at 15:12
  • I went round in circles for an hour... everything was perfect except the order... – me_ Jul 27 '18 at 23:28
3

You should use the putParcelableArrayListExtra() method on the Intent class.

Ovidiu Latcu
  • 71,607
  • 15
  • 76
  • 84
  • `intent.putParcelableArrayListExtra( "com.example.episodetracker.listofseries", (ArrayList extends Parcelable>) listOfSeries);` is this the correct way to do it? If I don't cast it, I get the following error: **The method putParcelableArrayListExtra(String, ArrayList extends Parcelable>) in the type Intent is not applicable for the arguments (String, List)** – Adrian Jandl Feb 28 '13 at 11:35
  • 12
    declare your `listOfSeries` as `ArrayList` not `List`. – Ovidiu Latcu Feb 28 '13 at 13:38
  • 1
    Alright, that made the compiler happy. However, the program still crashes once I try to read the data. I've updated the original post with a logcat snippet. – Adrian Jandl Feb 28 '13 at 14:19
3

I've used putParcelableArrayList(<? extends Parcelable>) from a Bundle Object. Not directly from an Intent Object.(I don't really know what's the difference). but i use to use in this way:

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

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

Later on your new activity you can populate the data recently inserted on the Bundle object like this:

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

Just remember that your ArrayList<> must contain only parcelable objects. and just to make sure that your have passed the data you may check if the data received is null or not, just to avoid issues.

AXSM
  • 1,142
  • 1
  • 12
  • 27
0

Maybe this helps someone.. else my problem was that I used write and readValue but it should match type like writeInt, readInt writeString, readString and so forth

Peter
  • 5,556
  • 3
  • 23
  • 38
0

I am doing it in this way:

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

And for making the class Parcelable . I simply do two operation first I used @Parcelize Annotation above my data class and secondly I inherit it with Parcelable like below..

import kotlinx.android.parcel.Parcelize
import android.os.Parcelable

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

And at receiving end

if (intent != null) {
     var results = intent.getParcelableArrayListExtra<Parcelable>("keyResults")
}
Eric Aya
  • 69,473
  • 35
  • 181
  • 253
Zar E Ahmer
  • 33,936
  • 20
  • 234
  • 300
0

You can pass Parcelable ArrayList

Sender Activity ->

startActivity(Intent(this, SenderActivity::class.java).apply { putExtra("getList",list)})

Receiver Activity ->

private lateinit var list: ArrayList<List>

list = this.intent.extras?.getParcelableArrayList("getList")!!

And you will get all Arraylist in list.