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

问题描述:

我有我使用从一个CSV文件(称为CSVReader)解析数据类,里面有用于解析一些方法,以及一对夫妇的字符串和一个自定义对象类型的列表(List allRecords)。 我正在做的是当应用程序加载时,将所有数据解析到该列表中,然后尝试将该信息传递给下一个活动,但在下一个活动中,我将所有记录保留为空。从一个Android的活动传递对象到另一个

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(中包)现在是零,所以是数据。

我做错了什么? 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

而不是'bundle.getParcelable(“this”);'它应该是'bundle.getParcelable(“list”);' –

+0

@DanielZolnai你是对的,但是这并没有解决它 – John

+0

请张贴你的自定义对象类,您正在尝试传递给下一个活动的类。 –

[编辑]

我是看在你的代码一遍,发现你写的列表中包裹LAST并从包裹FIRST阅读列表。您必须按照书面顺序读取包裹中的物品。请尝试将dest.writeList(allRecords)放在方法的顶部,以便它成为写入的第一项,或者可以将in.readList(allRecords, DummyData.class.getClassLoader())放在该方法列表的底部。

给它一个镜头。

//////////////////////////////////////////////

从文档,

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

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

您正在使用writeList()将数据写入宗地。尝试使用writeTypedList()。我相信你也可以试着改变readTypedList()readList()。例如:

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

希望这会有所帮助。

+0

使用http://www.parcelabler.com/生成parcelable类。 – user2260040

+0

哦好点!我甚至没有想到这些搞砸了,但它是有道理的。我会给它一个镜头,看看发生了什么事谢谢 – John

+1

没问题:),高兴地帮助。 –

您需要使用putExtras方法把包对象。然后你可以使用getIntent()。getExtras()来获得包。

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

如果您打算将数据传递给另一个活动,则需要使用实现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()); 
} 

} 

我包括城市模型,所以你可以看到它是如何去对象与对象列表。假设你有一个推算未来实例的所有值 'FORCAST'(推算未来FORCAST =新推算未来()或类似的东西)

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

我希望帮助

+0

我的自定义类看起来非常相似,所以我不确定它为什么不起作用。我做了一些改变,比如将'in.readTypedList(...)'改为'in.readList(...)',但仍然不起作用。在你的例子中,'Weather'类是怎么样的? – John

+0

你可以在这里看到一切。 https://github.com/siambo/android/blob/master/WeazrAPI/src/com/weazrapi/model/Weather.java –