将对象从一个Android活动传递到另一个

时间:2016-01-20 19:26:09

标签: android

我有一个类用于解析来自csv文件(称为CSVReader)的数据,其中有一些解析方法以及一些字符串和一个自定义对象的列表type(列出所有记录)。 我正在做的是当应用程序加载时,将所有数据解析到该列表中,然后尝试将该信息传递到下一个活动,但在下一个活动中,我将allRecords保持为null。

LoginActivity

    CSVReader data = new CSVReader();
    data.populateRecords(this);
    Intent intent = new Intent(LoginActivity.this, Find.class);
    Bundle bundle = new Bundle();
    bundle.putParcelable("list", data);
    intent.putExtra("bundle", bundle);
    startActivity(intent);

我已经完成了调试器,捆绑包里肯定有数据。

查找

Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("bundle");
data = (CSVReader) bundle.getParcelable("list");

仍然使用调试器,而mMap(在bundle中)现在为null,数据也是如此。

我做错了吗? DummyData和CSVReader这两个类都实现了Parcelable。

编辑:添加自定义类CSVReader:

    List<DummyData> allRecords;
    private String base;
    private String location;
    private String partner;

    public static Creator<CSVReader> CREATOR = new Creator<CSVReader>(){
        @Override
        public CSVReader createFromParcel(Parcel source){
            return new CSVReader(source);
        }
        @Override
        public CSVReader[] newArray(int size) {
            return new CSVReader[size];
        }
    };

    private CSVReader(Parcel in){
            allRecords = new ArrayList<DummyData>();
            in.readTypedList(allRecords, DummyData.CREATOR);
            base = in.readString();
            location = in.readString();
            partner = in.readString();
    }
   ...
   ...

    @Override
    public int describeContents() {
            return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(base);
            dest.writeString(location);
            dest.writeString(partner);
            dest.writeList(allRecords);
     }

3 个答案:

答案 0 :(得分:1)

如果您计划将数据传递给另一个活动,则需要使用实现Parcelable的类对象。这是一个例子,

package com.weather.model;

import java.util.ArrayList;
import java.util.List;

import android.os.Parcel;
import android.os.Parcelable;

public class Forcast implements Parcelable {

private String id;
private String code;
private String message;
private City city;
private String count;
private List<Weather> weatherList = new ArrayList<Weather>();

public Forcast(){
}

public String getId() {
    return id;
}
public void setId(String id) {
    this.id = id;
}
public String getCode() {
    return code;
}
public void setCode(String code) {
    this.code = code;
}
public String getMessage() {
    return message;
}
public void setMessage(String message) {
    this.message = message;
}
public City getCity() {
    return city;
}
public void setCity(City city) {
    this.city = city;
}
public String getCount() {
    return count;
}
public void setCount(String count) {
    this.count = count;
}
public List<Weather> getWeatherList() {
    return weatherList;
}
public void setWeatherList(List<Weather> weather) {
    this.weatherList = weather;
}


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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(id);
    dest.writeString(code);
    dest.writeString(message);
    dest.writeParcelable(city, flags);
    dest.writeString(count);
    dest.writeList(weatherList);

}

public static final Parcelable.Creator<Forcast> CREATOR = new Parcelable.Creator<Forcast>() {

    @Override
    public Forcast createFromParcel(Parcel source) {
        return new Forcast(source);
    }

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

protected Forcast(Parcel in){
    id = in.readString();
    code = in.readString();
    message = in.readString();
    city = (City)in.readParcelable(City.class.getClassLoader());
    count = in.readString();
    in.readList(weatherList, Weather.class.getClassLoader());
}

}

我包含了City模型,因此您可以看到对象与对象列表相比如何。假设您有一个Forcast实例,其中包含的所有值为&#39; forcast&#39; (Forcast forcast = new Forcast()或类似的东西)

Intent intent = new Intent(this, SomeActivity.class);
intent.putExtra(com.weather.model,forcast)
startActivity(intent)

我希望有帮助

答案 1 :(得分:1)

<强> [编辑]

我再次查看您的代码,并注意到您正在将列表写入最后包裹并从包 FIRST 中读取列表。您必须按照写入的顺序从包裹中读取项目。尝试将dest.writeList(allRecords)放在方法的顶部,这样它就是第一个写入的项目,或者您可以将in.readList(allRecords, DummyData.class.getClassLoader())放在该方法列表的底部。

试一试。

////////////////////////////////////////////// < / p>

来自文档,

public final void readTypedList (List<T> list, Creator<T> c)

  

读入包含特定对象类型的给定List项   在当前使用writeTypedList(List)编写的   dataPosition()。该列表必须先前已经写过   writeTypedList(List)具有相同的对象类型。

您正在使用writeList()将数据写入地块。尝试使用writeTypedList()。您也可以尝试使用readTypedList()更改readList()我相信。类似的东西:

in.readList(allRecords, CSVReader.class.getClassLoader());

希望这有帮助。

答案 2 :(得分:0)

您需要使用putExtras方法放置bundle对象。然后你可以使用getIntent()。getExtras()来获取bundle。

Intent intent = new Intent(LoginActivity.this, Find.class);
Bundle bundle = new Bundle();
bundle.putParcelable("list", data);
intent.putExtras( bundle);
startActivity(intent);

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
data = (CSVReader) bundle.getParcelable("list");