Android使用包含另一个散列表的散列表实现Parcelable对象 [英] Android implement Parcelable objects with hashmap that contains another hashmap

查看:139
本文介绍了Android使用包含另一个散列表的散列表实现Parcelable对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是 Android的实现Parcelable对象,它具有hashmap 但我的情况有点不同。



我有这些课程

 公共类EventDetails实现Parcelable {
私有字符串ID;
私人字符串eventName;
Private Long eventUnixTime;
私有HashMap< String,User> pickedUser = null;
}

  public class User实现Parcelable {
private String email;
private String userName;
private String userPicture;
私有布尔hasLoggedInWithPassword;
私有HashMap< String,Object> dateJoined = null;

public User(){

}

public User(String email,String userName,String userPicture,Boolean hasLoggedInWithPassword,HashMap< String,Object> ; dateJoined){
this.email = email;
this.userName = userName;
this.userPicture = userPicture;
this.hasLoggedInWithPassword = hasLoggedInWithPassword;
this.dateJoined = dateJoined;
}

保护用户(Parcel in){
email = in.readString();
userName = in.readString();
userPicture = in.readString();

int size = in.readInt();
for(int i = 0; i< size; i ++){
String key = in.readString();
Object value = in.readString();
dateJoined.put(key,value);
}
}

public static final Creator< User> CREATOR = new Creator< User>(){
@Override
public User createFromParcel(Parcel in){
return new User(in);
}

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

public String getEmail(){
return email;
}

public String getUserName(){
return userName;
}

public String getUserPicture(){
return userPicture;
}

public Boolean getHasLoggedInWithPassword(){
return hasLoggedInWithPassword;
}

public HashMap< String,Object> getDateJoined(){
return dateJoined;

$ b @Override
public int describeContents(){
Log.i(describeUser,描述来自User.java的内容);

返回0;

$ b @Override
public void writeToParcel(parcel dest,int flags){

Log.i(write to Parcel,write从User.java到Parcel);
dest.writeString(email);
dest.writeString(userName);
dest.writeString(userPicture);
dest.writeInt(hasLoggedInWithPassword?1:0);

dest.writeInt(dateJoined.size());
for(HashMap.Entry< String,Object> entry:dateJoined.entrySet()){
dest.writeString(entry.getKey());
dest.writeString(String.valueOf(entry.getValue()));
}
}
}

EventDetails类中的方法:

  protected EventDetails(Parcel in){
id = in.readString();
eventName = in.readString();
eventUnixTime = in.readLong();

final int size = in.readInt();
for(int i = 0; i< size; i ++){
String key = in.readString();
User user = in.readHashMap(userMap);
pickedFriendsHashMap.put(key,user);


$ b @Override
public void writeToParcel(Parcel dest,int flags){

dest.writeInt(pickedFriendsHashMap.size ()); (HashMap.Entry< String,User> entry:pickedFriendsHashMap.entrySet()){
dest.writeString(entry.getKey());



dest.writeInt(listLength); (用户用户:userList){
dest.writeParcelable(user,0);


}
}

dest.writeString(id);
dest.writeString(eventName);
dest.writeLong(eventUnixTime);
}

请告诉我如何正确地将这些类放入包裹并发送。



谢谢。


解决方案

Android studio已经提供了插件(Android Parcelable code generator)来生成 Parcelable 方法自动。



为了使用上面的插件,我创建了下面的类,使用 Parcelable 自动生成的方法

  public class EventDetails implements Parcelable {

private String id;
private String eventName;
私人长期eventUnixTime;
私有HashMap< String,User> pickedUser;


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

@Override
public void writeToParcel(Parcel dest,int flags){
dest.writeString(this.id);
dest.writeString(this.eventName);
dest.writeValue(this.eventUnixTime);
dest.writeSerializable(this.pickedUser);
}

public EventDetails(){
}

protected EventDetails(Parcel in){
this.id = in.readString( );
this.eventName = in.readString();
this.eventUnixTime =(Long)in.readValue(Long.class.getClassLoader());
this.pickedUser =(HashMap< String,User>)in.readSerializable();
}

public static final Creator&EventDetails> CREATOR = new Creator< EventDetails>(){
@Override
public EventDetails createFromParcel(Parcel source){
return new EventDetails(source);
}

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

public class User实现Parcelable {
private String email;
private String userName;
private String userPicture;
私有布尔hasLoggedInWithPassword;
私有HashMap< String,Object> dateJoined = null;
$ b $ public User(String email,String userName,String userPicture,Boolean hasLoggedInWithPassword,HashMap< String,Object> dateJoined){
this.email = email;
this.userName = userName;
this.userPicture = userPicture;
this.hasLoggedInWithPassword = hasLoggedInWithPassword;
this.dateJoined = dateJoined;
}


public String getEmail(){
return email;
}

public String getUserName(){
return userName;
}

public String getUserPicture(){
return userPicture;
}

public Boolean getHasLoggedInWithPassword(){
return hasLoggedInWithPassword;
}

public HashMap< String,Object> getDateJoined(){
return dateJoined;
}


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

@Override
public void writeToParcel(Parcel dest,int flags){
dest.writeString(this.email);
dest.writeString(this.userName);
dest.writeString(this.userPicture);
dest.writeValue(this.hasLoggedInWithPassword);
dest.writeSerializable(this.dateJoined);
}

保护用户(Parcel in){
this.email = in.readString();
this.userName = in.readString();
this.userPicture = in.readString();
this.hasLoggedInWithPassword =(布尔值)in.readValue(Boolean.class.getClassLoader());
this.dateJoined =(HashMap< String,Object>)in.readSerializable();
}

public static final Creator< User> CREATOR = new Creator< User>(){
@Override
public User createFromParcel(Parcel source){
return new User(source);
}

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


This is an extension for Android implement Parcelable object which has hashmap but mine is a little different.

I have these classes

public class EventDetails implements Parcelable {
    Private String id;
    Private String eventName;
    Private Long eventUnixTime;
    Private HashMap <String, User> pickedUser = null;
}

and

public class User implements Parcelable {
    private String email;
    private String userName;
    private String userPicture;
    private Boolean hasLoggedInWithPassword;
    private HashMap<String, Object> dateJoined = null;

    public User() {

    }

    public User(String email, String userName, String userPicture, Boolean hasLoggedInWithPassword, HashMap<String, Object> dateJoined) {
        this.email = email;
        this.userName = userName;
        this.userPicture = userPicture;
        this.hasLoggedInWithPassword = hasLoggedInWithPassword;
        this.dateJoined = dateJoined;
    }

    protected User(Parcel in) {
        email = in.readString();
        userName = in.readString();
        userPicture = in.readString();

        int size = in.readInt();
        for (int i = 0; i < size; i++) {
            String key = in.readString();
            Object value = in.readString();
            dateJoined.put(key, value);
        }
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

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

    public String getEmail() {
        return email;
    }

    public String getUserName() {
        return userName;
    }

    public String getUserPicture() {
        return userPicture;
    }

    public Boolean getHasLoggedInWithPassword() {
        return hasLoggedInWithPassword;
    }

    public HashMap<String, Object> getDateJoined() {
        return dateJoined;
    }

    @Override
    public int describeContents() {
        Log.i("describeUser", "describe content from User.java");

        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {

        Log.i("write to Parcel", "write to Parcel from User.java");
        dest.writeString(email);
        dest.writeString(userName);
        dest.writeString(userPicture);
        dest.writeInt(hasLoggedInWithPassword ? 1:0);

        dest.writeInt(dateJoined.size());
        for (HashMap.Entry<String, Object> entry : dateJoined.entrySet()) {
            dest.writeString(entry.getKey());
            dest.writeString(String.valueOf(entry.getValue()));
        }
    }
}

I'm stuck in these methods in the EventDetails class:

protected EventDetails(Parcel in) {
    id = in.readString();
    eventName = in.readString();
    eventUnixTime = in.readLong();

    final int size = in.readInt();
    for (int i = 0; i < size; i++) {
        String key = in.readString();
        User user = in.readHashMap(userMap);
        pickedFriendsHashMap.put(key, user);
    }
}

 @Override
    public void writeToParcel(Parcel dest, int flags) {

        dest.writeInt(pickedFriendsHashMap.size());

        for (HashMap.Entry<String, User> entry :    pickedFriendsHashMap.entrySet()) {
            dest.writeString(entry.getKey());

        dest.writeInt(listLength);

        for (User user: userList) {
            dest.writeParcelable(user, 0);
        }
    }

    dest.writeString(id);
    dest.writeString(eventName);
    dest.writeLong(eventUnixTime);
}

Please advise how I can properly put these classes in parcels and send in bundle.

Thank you.

-R

解决方案

Android studio already provide plugin (Android Parcelable code generator) to generate Parcelable methods automatically.

For using above plugin i have create below classes with Parcelable auto generated methods

public class EventDetails implements Parcelable {

    private String id;
    private String eventName;
    private Long eventUnixTime;
    private HashMap<String, User> pickedUser;


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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.id);
        dest.writeString(this.eventName);
        dest.writeValue(this.eventUnixTime);
        dest.writeSerializable(this.pickedUser);
    }

    public EventDetails() {
    }

    protected EventDetails(Parcel in) {
        this.id = in.readString();
        this.eventName = in.readString();
        this.eventUnixTime = (Long) in.readValue(Long.class.getClassLoader());
        this.pickedUser = (HashMap<String, User>) in.readSerializable();
    }

    public static final Creator<EventDetails> CREATOR = new Creator<EventDetails>() {
        @Override
        public EventDetails createFromParcel(Parcel source) {
            return new EventDetails(source);
        }

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

public class User implements Parcelable {
    private String email;
    private String userName;
    private String userPicture;
    private Boolean hasLoggedInWithPassword;
    private HashMap<String, Object> dateJoined = null;

    public User(String email, String userName, String userPicture, Boolean hasLoggedInWithPassword, HashMap<String, Object> dateJoined) {
        this.email = email;
        this.userName = userName;
        this.userPicture = userPicture;
        this.hasLoggedInWithPassword = hasLoggedInWithPassword;
        this.dateJoined = dateJoined;
    }


    public String getEmail() {
        return email;
    }

    public String getUserName() {
        return userName;
    }

    public String getUserPicture() {
        return userPicture;
    }

    public Boolean getHasLoggedInWithPassword() {
        return hasLoggedInWithPassword;
    }

    public HashMap<String, Object> getDateJoined() {
        return dateJoined;
    }


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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.email);
        dest.writeString(this.userName);
        dest.writeString(this.userPicture);
        dest.writeValue(this.hasLoggedInWithPassword);
        dest.writeSerializable(this.dateJoined);
    }

    protected User(Parcel in) {
        this.email = in.readString();
        this.userName = in.readString();
        this.userPicture = in.readString();
        this.hasLoggedInWithPassword = (Boolean) in.readValue(Boolean.class.getClassLoader());
        this.dateJoined = (HashMap<String, Object>) in.readSerializable();
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel source) {
            return new User(source);
        }

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

这篇关于Android使用包含另一个散列表的散列表实现Parcelable对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆