Android中的Activity之间传递自定义类型的List的方法
2018-02-25 16:45
381 查看
一、传递自定义类型
当Activity之间进行通信时,我们通常会遇到传递自定义类型,正如我们所知,自定义类型是无法直接通过Android中的Intent进行传递的,这时,我们可以采取将自定义类型实现Parcelable接口,并使用Intent的putExtras来进行传递。
以下是本人的一个数据类的实例:public class UserData implements Parcelable{
private String username;
private String password;
private String Email;
private boolean logined;
public UserData() {
this.username = "";
this.password = "";
this.Email = "";
this.logined = false;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(username);
dest.writeString(password);
dest.writeString(Email);
}
public UserData(String username, String password, String Email) {
this.username = username;
this.password = password;
this.Email = "";
this.logined = false;
}
public UserData(Parcel in) {
username = in.readString();
password = in.readString();
Email = in.readString();
}
public static final Creator<UserData> CREATOR = new Creator<UserData>() {
@Override
public UserData createFromParcel(Parcel in) {
return new UserData(in);
}
@Override
public UserData[] newArray(int size) {
return new UserData[size];
}
};
@Override
public int describeContents() {
return 0;
}
public String getUsername() {
return this.username;
}
public String getPassword() {
return this.password;
}
public void setLoginStatus(boolean status) {
this.logined = status;
}
public boolean isLogined() {
return this.logined;
}
public void setUsername( String username ) {
this.username = username;
}
public void setPassword( String password ) {
this.password = password;
}
public void setEmail( String email ) {
this.Email = email;
}
@Override
public String toString() {
return "User{" +
"name='" + username + '\'' +
", password='" + password + '\'' +
", Email='" + Email + '\'' +
'}';
}
}注意在实现接口时,一定要实现
public void writeToParcel(Parcel dest, int flags);
public int describeContents();
并且此类一定要包含一个静态的CREATOR(见代码)
如果这个类还包含一个自定义类型的对象,那么这个自定义的类型也应当实现Parcelable接口。
并且,在writeToParcel这个函数中使用writeParcelable方法来写入Parcel,在获取Parcel中的对象时(见代码的
public UserData(Parcel in) 构造函数),要使用readParcelable读取.
二、传递List的自定义类型
传递List的自定义类型与上方类似,只是在写入Parcel和读取时有所不同
本人有一个小小的实例,这是一个包含两个类型的例子:
Tag.java
public class Tag implements Parcelable{
private String tag_name;
private String tag_num;
private String tag_url;
4000
public List<Article> articles = new ArrayList<>();
@Override
public void writeToParcel(
Parcel dest,
int flags
) {
dest.writeString(this.getTag_name());
dest.writeString(this.getTag_num());
dest.writeString(this.getTag_url());
dest.writeTypedArray(
this.getArticles().toArray(new Article[this.getArticles().size()]),
flags
);
}
public Tag() {
this.tag_url = "";
this.tag_name = "";
this.tag_num = "";
}
public Tag( String _tag_name, String _tag_num, String _tag_url) {
this.tag_name = _tag_name;
this.tag_num = _tag_num;
this.tag_url = _tag_url;
}
public Tag( Parcel parcel ) {
this.tag_name = parcel.readString();
this.tag_num = parcel.readString();
this.tag_url = parcel.readString();
// Article[] temp = parcel.readParcelableArray(Article.class.getClassLoader());
Article[] temp = parcel.createTypedArray(Article.CREATOR);
this.articles = Arrays.asList(temp);
}
public static final Creator<Tag> CREATOR = new Creator<Tag>() {
@Override
public Tag createFromParcel(Parcel parcel) {
return new Tag(parcel);
}
@Override
public Tag[] newArray(int size) {
return new Tag[size];
}
};
@Override
public int describeContents() {
return 0;
}
public void setTag_name( String name ) {
this.tag_name = name;
}
public void setTag_num( String num ) {
this.tag_num = tag_num;
}
public void setTag_url( String url ) {
this.tag_url = url;
}
public String getTag_name() {
return this.tag_name;
}
public String getTag_num() {
return this.tag_num;
}
public String getTag_url() {
return this.tag_url;
}
public List<Article> getArticles() {
return articles;
}
public void setArticles(List<Article> articles) {
this.articles = articles;
}
@Override
public String toString() {
String article = "";
for (int i = 0; i < articles.size(); ++i) {
article += articles.get(i).toString() + "\n";
}
return
" : " + this.tag_num + " : " + this.tag_url + "\n" + article;
}
}
Article.javapublic class Article implements Parcelable{
private String title;
private String url;
private String date;
private String publisher;
@Override
public void writeToParcel(Parcel dest, int flags){
dest.writeString(this.title);
dest.writeString(this.url);
}
public Article() {
this.title = "";
this.url = "";
}
public Article(String _title, String _content) {
this.title = _title;
this.url = _content;
}
public Article( Parcel parcel ) {
this.title = parcel.readString();
this.url = parcel.readString();
}
public static final Creator<Article> CREATOR = new Creator<Article>() {
@Override
public Article createFromParcel(Parcel parcel) {
return new Article(parcel);
}
@Override
public Article[] newArray(int size) {
return new Article[size];
}
};
@Override
public int describeContents() {
return 0;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
@Override
public String toString() {
return this.url;
}
}
当Activity之间进行通信时,我们通常会遇到传递自定义类型,正如我们所知,自定义类型是无法直接通过Android中的Intent进行传递的,这时,我们可以采取将自定义类型实现Parcelable接口,并使用Intent的putExtras来进行传递。
以下是本人的一个数据类的实例:public class UserData implements Parcelable{
private String username;
private String password;
private String Email;
private boolean logined;
public UserData() {
this.username = "";
this.password = "";
this.Email = "";
this.logined = false;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(username);
dest.writeString(password);
dest.writeString(Email);
}
public UserData(String username, String password, String Email) {
this.username = username;
this.password = password;
this.Email = "";
this.logined = false;
}
public UserData(Parcel in) {
username = in.readString();
password = in.readString();
Email = in.readString();
}
public static final Creator<UserData> CREATOR = new Creator<UserData>() {
@Override
public UserData createFromParcel(Parcel in) {
return new UserData(in);
}
@Override
public UserData[] newArray(int size) {
return new UserData[size];
}
};
@Override
public int describeContents() {
return 0;
}
public String getUsername() {
return this.username;
}
public String getPassword() {
return this.password;
}
public void setLoginStatus(boolean status) {
this.logined = status;
}
public boolean isLogined() {
return this.logined;
}
public void setUsername( String username ) {
this.username = username;
}
public void setPassword( String password ) {
this.password = password;
}
public void setEmail( String email ) {
this.Email = email;
}
@Override
public String toString() {
return "User{" +
"name='" + username + '\'' +
", password='" + password + '\'' +
", Email='" + Email + '\'' +
'}';
}
}注意在实现接口时,一定要实现
public void writeToParcel(Parcel dest, int flags);
public int describeContents();
并且此类一定要包含一个静态的CREATOR(见代码)
如果这个类还包含一个自定义类型的对象,那么这个自定义的类型也应当实现Parcelable接口。
并且,在writeToParcel这个函数中使用writeParcelable方法来写入Parcel,在获取Parcel中的对象时(见代码的
public UserData(Parcel in) 构造函数),要使用readParcelable读取.
二、传递List的自定义类型
传递List的自定义类型与上方类似,只是在写入Parcel和读取时有所不同
本人有一个小小的实例,这是一个包含两个类型的例子:
Tag.java
public class Tag implements Parcelable{
private String tag_name;
private String tag_num;
private String tag_url;
4000
public List<Article> articles = new ArrayList<>();
@Override
public void writeToParcel(
Parcel dest,
int flags
) {
dest.writeString(this.getTag_name());
dest.writeString(this.getTag_num());
dest.writeString(this.getTag_url());
dest.writeTypedArray(
this.getArticles().toArray(new Article[this.getArticles().size()]),
flags
);
}
public Tag() {
this.tag_url = "";
this.tag_name = "";
this.tag_num = "";
}
public Tag( String _tag_name, String _tag_num, String _tag_url) {
this.tag_name = _tag_name;
this.tag_num = _tag_num;
this.tag_url = _tag_url;
}
public Tag( Parcel parcel ) {
this.tag_name = parcel.readString();
this.tag_num = parcel.readString();
this.tag_url = parcel.readString();
// Article[] temp = parcel.readParcelableArray(Article.class.getClassLoader());
Article[] temp = parcel.createTypedArray(Article.CREATOR);
this.articles = Arrays.asList(temp);
}
public static final Creator<Tag> CREATOR = new Creator<Tag>() {
@Override
public Tag createFromParcel(Parcel parcel) {
return new Tag(parcel);
}
@Override
public Tag[] newArray(int size) {
return new Tag[size];
}
};
@Override
public int describeContents() {
return 0;
}
public void setTag_name( String name ) {
this.tag_name = name;
}
public void setTag_num( String num ) {
this.tag_num = tag_num;
}
public void setTag_url( String url ) {
this.tag_url = url;
}
public String getTag_name() {
return this.tag_name;
}
public String getTag_num() {
return this.tag_num;
}
public String getTag_url() {
return this.tag_url;
}
public List<Article> getArticles() {
return articles;
}
public void setArticles(List<Article> articles) {
this.articles = articles;
}
@Override
public String toString() {
String article = "";
for (int i = 0; i < articles.size(); ++i) {
article += articles.get(i).toString() + "\n";
}
return
" : " + this.tag_num + " : " + this.tag_url + "\n" + article;
}
}
Article.javapublic class Article implements Parcelable{
private String title;
private String url;
private String date;
private String publisher;
@Override
public void writeToParcel(Parcel dest, int flags){
dest.writeString(this.title);
dest.writeString(this.url);
}
public Article() {
this.title = "";
this.url = "";
}
public Article(String _title, String _content) {
this.title = _title;
this.url = _content;
}
public Article( Parcel parcel ) {
this.title = parcel.readString();
this.url = parcel.readString();
}
public static final Creator<Article> CREATOR = new Creator<Article>() {
@Override
public Article createFromParcel(Parcel parcel) {
return new Article(parcel);
}
@Override
public Article[] newArray(int size) {
return new Article[size];
}
};
@Override
public int describeContents() {
return 0;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
@Override
public String toString() {
return this.url;
}
}
相关文章推荐
- android activity之间传递bean类型数据如(list<UVedioBean> )
- 17开年第一篇Activity之间传递List<T> 以及T对象类型数据的方法
- Android两个Activity之间传递List<Object>对象
- 在两个activity之间使用intent传递list类型的对象
- Android中Activity之间数据传递的几种方法总结
- Android中Activity之间数据传递的几种方法总结
- Android Activity之间传递非原始数据类型
- Android之Activity之间的数据传递-多种方法
- Android中activity之间传递数据的几种实现方法
- Android 在Activity中通过Bundle传递自定义数据类型
- Android中Activity之间传递自定义对象
- JSON:在两个activity之间使用intent传递list类型的对象
- android 在activity之间传递复杂数据类型
- Android中两个activity之间传递list<object>
- 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)
- android: activity之间传递复杂数据类型[使用Serializable序列化或者Parcelable序列化]
- Android中不同Activity之间传递自定义对象的参数问题的解决
- Android入门-Activity之间数据传递方法之Bundle
- Android Activity之间传递图片(Bitmap)的方法
- android中自定义数据类型在两个activity间的传递