我有一个类用于解析来自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);
}
答案 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");