通过 Intent 传递自定义对象列表
Posted
技术标签:
【中文标题】通过 Intent 传递自定义对象列表【英文标题】:Passing Custom Object List through Intent 【发布时间】:2018-12-30 04:42:05 【问题描述】:我正在尝试制作一个从 JSON 获取数据并使用它在地图上显示位置的应用程序。当列表被直接加载到包含地图片段的活动中时,地图机制运行良好。现在,当尝试在另一个活动中加载列表,然后尝试通过意图发送列表时,我无法显示数据,我认为这与意图有关。
这是Intent发送部分
if (data != null && !data.isEmpty())
List<AirQuality> receivedData= (List<AirQuality>) data;
Intent intent = new Intent(AirQualityActivity.this, MapsActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("MYLIST",(Serializable) data);
intent.putExtras(bundle);
startActivity(intent);
这是Intent接收部分
Intent i = getIntent();
Bundle b = i.getExtras();
List<AirQuality> receivedDataList = (List<AirQuality>) b.getSerializable("MYLIST");
这是实现 Serializable 的自定义对象类
import java.io.Serializable;
public class AirQuality implements Serializable
private String mId;
private String mStation;
private String mState;
private String mCity;
private String mPollutantID;
private String mPollutantAvg;
private String mPollutantMin;
private String mPollutantMax;
/*Default Constructor*/
public AirQuality(String id, String station, String state, String city, String pollutantID, String pollutantAvg ,String pollutantMin, String pollutantMax)
mId = id;
mStation = station;
mState = state;
mCity = city;
mPollutantID = pollutantID;
mPollutantAvg = pollutantAvg;
mPollutantMin = pollutantMin;
mPollutantMax = pollutantMax;
//Returns Item ID
public String getId()
return mId;
//Returns Station Name
public String getStation()
return mStation;
//Returns State Name
public String getState()
return mState;
//Returns City Name
public String getCity()
return mCity;
//Returns Pollutant ID
public String getPollutantID()
return mPollutantID;
//Return Pollutant Average value
public String getPollutantAvg()
return mPollutantAvg;
//Returns Pollutant Minimum value
public String getPollutantMin()
return mPollutantMin;
//Returns Pollutant Maximum value
public String getPollutantMax()
return mPollutantMax;
任何帮助将不胜感激。提前致谢。
【问题讨论】:
“我无法显示数据”是什么意思? 检查你在下一个活动中获得了什么价值。 我的意思是,我在 AirQualityActivity.java 文件中获取 List 类型的解析 JSON 数据,然后通过意图将接收到的列表发送到 MapsActivity.java。在该文件的 onCreate() 方法中,我将其作为另一个方法调用的参数,该方法调用会进行某种检查并在地图上显示位置和标记。当我直接在 MapsActivity.java 中获取列表时,我能够做到这一点,但现在当我不得不从另一个文件中获取它时,我无法做到。显示空对象引用错误。 【参考方案1】:首先我推荐实现 Parcelable 而不是 Serializable。在以下功能方面速度,反射等......
回答你的问题:
您说“现在尝试在另一个活动中加载列表,然后尝试通过意图发送列表时,我无法显示数据” 我编译了您的代码,它运行成功。它将列表从 firstActivity 发送到 secondActivity,然后对第二个进行审查,没有任何问题。
【讨论】:
我的意思是,我在 AirQualityActivity.java 文件中获取 List 类型的解析 JSON 数据,然后通过意图将接收到的列表发送到 MapsActivity.java。在该文件的 onCreate() 方法中,我将其作为另一个方法调用的参数,该方法调用会进行某种检查并在地图上显示位置和标记。当我直接在 MapsActivity.java 中获取列表时,我能够做到这一点,但现在当我不得不从另一个文件中获取它时,我无法做到。显示空对象引用错误。【参考方案2】:试试这个:
空气质量
public class AirQuality implements Parcelable
private String mId;
private String mStation;
private String mState;
private String mCity;
private String mPollutantID;
private String mPollutantAvg;
private String mPollutantMin;
private String mPollutantMax;
public AirQuality()
public AirQuality(String mId, String mStation, String mState, String mCity, String mPollutantID, String mPollutantAvg, String mPollutantMin, String mPollutantMax)
this.mId = mId;
this.mStation = mStation;
this.mState = mState;
this.mCity = mCity;
this.mPollutantID = mPollutantID;
this.mPollutantAvg = mPollutantAvg;
this.mPollutantMin = mPollutantMin;
this.mPollutantMax = mPollutantMax;
protected AirQuality(Parcel in)
mId = in.readString();
mStation = in.readString();
mState = in.readString();
mCity = in.readString();
mPollutantID = in.readString();
mPollutantAvg = in.readString();
mPollutantMin = in.readString();
mPollutantMax = in.readString();
public static final Creator<AirQuality> CREATOR = new Creator<AirQuality>()
@Override
public AirQuality createFromParcel(Parcel in)
return new AirQuality(in);
@Override
public AirQuality[] newArray(int size)
return new AirQuality[size];
;
public String getmId()
return mId;
public void setmId(String mId)
this.mId = mId;
public String getmStation()
return mStation;
public void setmStation(String mStation)
this.mStation = mStation;
public String getmState()
return mState;
public void setmState(String mState)
this.mState = mState;
public String getmCity()
return mCity;
public void setmCity(String mCity)
this.mCity = mCity;
public String getmPollutantID()
return mPollutantID;
public void setmPollutantID(String mPollutantID)
this.mPollutantID = mPollutantID;
public String getmPollutantAvg()
return mPollutantAvg;
public void setmPollutantAvg(String mPollutantAvg)
this.mPollutantAvg = mPollutantAvg;
public String getmPollutantMin()
return mPollutantMin;
public void setmPollutantMin(String mPollutantMin)
this.mPollutantMin = mPollutantMin;
public String getmPollutantMax()
return mPollutantMax;
public void setmPollutantMax(String mPollutantMax)
this.mPollutantMax = mPollutantMax;
@Override
public int describeContents()
return 0;
@Override
public void writeToParcel(Parcel parcel, int i)
parcel.writeString(mId);
parcel.writeString(mStation);
parcel.writeString(mState);
parcel.writeString(mCity);
parcel.writeString(mPollutantID);
parcel.writeString(mPollutantAvg);
parcel.writeString(mPollutantMin);
parcel.writeString(mPollutantMax);
意图发送部分
bundle.putParcelableArrayList("MYLIST", data);
意图接收部分
List<AirQuality> receivedDataList = bundle.getParcelableArrayList("MYLIST");
【讨论】:
以上是关于通过 Intent 传递自定义对象列表的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Intent 中传递自定义对象:方法 Put Extra 对于 Intent 类型不明确