Массив подлежащих передаче объектов не переносится между действиями - PullRequest
0 голосов
/ 01 июля 2019

У меня есть 2 объекта, которые будут разделены между различными действиями в моем приложении, Пользователем и Аккаунтом.Оба они реализуют Parcelable.User, хранящий массив объектов Account, называемый userAccounts, который предназначен для переноса между действиями, однако массив не переносится между действиями, он приходит с 0 объектами, даже если он был заполнен в источнике.активность (я уже проверил это).Другие пользовательские переменные передаются правильно, поэтому я знаю, что это, вероятно, не является проблемой в реализации Parcelable.

Я пытался реализовать следующие методы Parcelable

Методы записи

writeArray ();writeTypedArray ();

Методы чтения

readArray ();readTypedArray ();

В дополнение к этому я проверил, что массив заполнен, и методы getters и setters в моем объекте доступны правильно. Ниже приведен код для объектов, реализующих User и Account

public class Account implements Parcelable {
private String type;
private String name;
private int amount;
public Account(String type, String name, int amount){
    this.type=type;
    this.name=name;
    this.amount=amount;
}
public String getType(){
    return type;
}
public String getName(){
    return name;
}
public int getAmount(){
    return amount;
}
//Parcelable methods
public void writeToParcel(Parcel dest, int flags){
    dest.writeString(type);
    dest.writeString(name);
    dest.writeInt(amount);

}
//Parcelable constructor
public Account(Parcel parcel){
    type=parcel.readString();
    name=parcel.readString();
    amount=parcel.readInt();

}
public static final Parcelable.Creator<Account> CREATOR= new Parcelable.Creator<Account>(){
    @Override
    public Account createFromParcel(Parcel parcel){
        return new Account(parcel);
    }
    @Override
    public Account [] newArray(int size){
        return new Account[size];
    }
};
public int describeContents(){
    return hashCode();
}

}

public class User implements Parcelable{
private String email_address;
private String user_name;
private String password;
private int totalIncome=0;
private int balance=0;
private int totalExpense=0;
private ArrayList<Account> userAccounts = new ArrayList<>();
private Account[] accountArray=new Account[userAccounts.size()];
public User(String email_address,String user_name,String password){
    this.email_address=email_address;
    this.user_name=user_name;
    this.password=password;
}
//method for the user to create accounts
public void createAccount(String type,String name, int amount){
    Account new_account= new Account(type,name,amount);
    userAccounts.add(new_account);
    if (new_account.getType().equals("Income")){
        totalIncome=totalIncome+new_account.getAmount();
    }
    else if (new_account.getType().equals("Expense")){
        totalExpense=totalExpense+new_account.getAmount();
    }

}
//Calculates the balance of all the accounts
public int calculateBalance (){
    balance=totalIncome-totalExpense;
    return balance;
}
//getters
public String getTotalIncome(){
    return Integer.toString(totalIncome);
}
public String getTotalExpense(){
    return Integer.toString(totalExpense);
}
public String getBalance(){
    return Integer.toString(balance);
}
public String getEmailAddress(){
    return email_address;
}
public String getUserName(){
    return user_name;
}
public String getPassword(){
    return password;
}
public Account[] getAccounts(){
    accountArray=this.convertToArray();
    System.out.println("Accounts accesed");
    System.out.println("accountArray size "+accountArray.length);
    return accountArray;
}
//setters
public void setTotalIncome(int totalIncome){
    this.totalIncome=totalIncome;
}
public void setTotalExpense(int totalExpense){
    this.totalExpense=totalExpense;
}
public void setAccounts(Account[] accounts){
    this.userAccounts=new ArrayList<Account>(Arrays.asList(accounts));
}
public void setBalance(int balance){
    this.balance=balance;
}
//Parcelable methods
//Converts userAccounts to Array for parcelable
public Account[] convertToArray(){
    accountArray=userAccounts.toArray(new Account[userAccounts.size()]);
    return accountArray;
}

//Write object values to parcel for storage
public void writeToParcel(Parcel parcel, int flags){
    parcel.writeString(email_address);
    parcel.writeString(user_name);
    parcel.writeString(password);
    parcel.writeInt(totalIncome);
    parcel.writeInt(balance);
    parcel.writeInt(totalExpense);
    parcel.writeTypedArray(accountArray,0);


}
//Parcel constructor
public User(Parcel parcel){
    email_address=parcel.readString();
    user_name=parcel.readString();
    password=parcel.readString();
    totalIncome=parcel.readInt();
    balance=parcel.readInt();
    totalExpense=parcel.readInt();
    accountArray=parcel.createTypedArray(Account.CREATOR);


}
//Parcel creator
public static final Parcelable.Creator<User> CREATOR=new Parcelable.Creator<User>(){
    @Override
    public User createFromParcel(Parcel parcel){
        return new User(parcel);
    }
    @Override
    public User[]newArray(int size){
        return new User[0];
    }

};
//Return hashcode of object
public int describeContents(){
    return hashCode();
}

При переходе между действиями массив переходит от наличия n элементов (столько, сколько я добавил) к 0 элементам, указывая данные accountArrayбыл потерян во время передачи посылки.Я ценю любые идеи, которые вы можете придумать

...