Передача вложенного массива объекта из адаптера в активность - PullRequest
0 голосов
/ 13 мая 2018

Я пытался передать массив вложенных объектов из адаптера в действие, и это действие не является действием, из которого создан адаптер. Я могу передать ему целое число или любые другие данные, но массив объектов равен нулю.

public class Rate implements Parcelable{
public final static Parcelable.Creator<Rate> CREATOR = new Creator<Rate>() {
    @SuppressWarnings({
            "unchecked"
    })
    public Rate createFromParcel(Parcel in) {
        return new Rate(in);
    }

    public Rate[] newArray(int size) {
        return (new Rate[size]);
    }

};
@SerializedName("header")
@Expose
private String header;
@SerializedName("body")
@Expose
private List<Body> body = null;
@SerializedName("footer")
@Expose
private String footer;
@SerializedName("type")
@Expose
private String rateCardType;
@SerializedName("rules")
@Expose
private List<Rule> rateRules = null;

protected RateCard(Parcel in) {
    this.header = ((String) in.readValue((String.class.getClassLoader())));
    in.readList(this.body, (Body.class.getClassLoader()));
    this.footer = ((String) in.readValue((String.class.getClassLoader())));
    this.rateCardType = ((String) in.readValue((String.class.getClassLoader())));
    in.readList(this.rateCardRules, (Rule.class.getClassLoader()));
}

public Rate() {
}

public List<Rule> getRateCardRules() {
    return rateCardRules;
}

public void setRateCardRules(List<Rule> rateCardRules) {
    this.rateCardRules = rateCardRules;
}

public String getHeader() {
    return header;
}

public void setHeader(String header) {
    this.header = header;
}

public List<Body> getBody() {
    return body;
}

public void setBody(List<Body> body) {
    this.body = body;
}

public String getFooter() {
    return footer;
}

public void setFooter(String footer) {
    this.footer = footer;
}

public String getRateCardType() {
    return rateCardType;
}

public void setRateCardType(String rateCardType) {
    this.rateCardType = rateCardType;
}

public void writeToParcel(Parcel dest, int flags) {
    dest.writeValue(header);
    dest.writeList(body);
    dest.writeValue(footer);
    dest.writeValue(rateCardType);
    dest.writeList(rateCardRules);
}

public int describeContents() {
    return  0;
}

}

Я хочу передать массив объектов правил другому занятию. Мое правило класс, как показано ниже

public class Rule implements Parcelable{
public final static Parcelable.Creator<Rule> CREATOR = new Creator<Rule>() {

    @SuppressWarnings({
            "unchecked"
    })
    public Rule createFromParcel(Parcel in) {
        return new Rule(in);
    }

    public Rule[] newArray(int size) {
        return (new Rule[size]);
    }

};
@SerializedName("rule")
@Expose
private  DataRows ruleData;
@SerializedName("rule_conditions")
@Expose
private List<DataRows> ruleConditions;
@SerializedName("slots")
@Expose
private List<DataRows> slots;
@SerializedName("header")
@Expose
private DataRows header;

protected Rule(Parcel in) {
    in.readList(this.ruleConditions, (DataRows.class.getClassLoader()));
    in.readList(this.slots, (DataRows.class.getClassLoader()));
    this.ruleData = in.readParcelable((DataRows.class.getClassLoader()));
    this.header = in.readParcelable((DataRows.class.getClassLoader()));
}

public Rule() {
}

public DataRows getRuleData() {
    return ruleData;
}

public void setRuleData(DataRows ruleData) {
    this.ruleData = ruleData;
}

public List<DataRows> getRuleConditions() {
    return ruleConditions;
}

public void setRuleConditions(List<DataRows> ruleConditions) {
    this.ruleConditions = ruleConditions;
}

public List<DataRows> getSlots() {
    return slots;
}

public void setSlots(List<DataRows> slots) {
    this.slots = slots;
}

public DataRows getHeader() {
    return header;
}

public void setHeader(DataRows header) {
    this.header = header;
}
public void writeToParcel(Parcel dest, int flags) {
    dest.writeList(ruleConditions);
    dest.writeList(slots);
    dest.writeParcelable(ruleData, flags);
    dest.writeParcelable(header, flags);
}

public int describeContents() {
    return  0;
}

}

Мой класс DataRows

public class DataRows implements Parcelable{
public final static Parcelable.Creator<DataRows> CREATOR = new Creator<DataRows>() {


    @SuppressWarnings({
            "unchecked"
    })
    public DataRows createFromParcel(Parcel in) {
        return new DataRows(in);
    }

    public DataRows[] newArray(int size) {
        return (new DataRows[size]);
    }

};
@SerializedName("key")
@Expose
private String key;
@SerializedName("value")
@Expose
private String value;

public String getKey() {
    return key;
}

public void setKey(String key) {
    this.key = key;
}

public String getValue() {
    return value;
}

public void setValue(String value) {
    this.value = value;
}

protected DataRows(Parcel in) {
    this.key = ((String) in.readValue((String.class.getClassLoader())));
    this.value = ((String) in.readValue((String.class.getClassLoader())));
}

public DataRows() {
}

public void writeToParcel(Parcel dest, int flags) {
    dest.writeValue(key);
    dest.writeValue(value);
}

public int describeContents() {
    return  0;
}

}

И вот как я пытаюсь передать значение

Intent intent = new Intent(context, RulesDetailActivity.class);
        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList("rules", (ArrayList<? extends Parcelable>) ruleList);
        bundle.putInt("current_rule_index", ruleIndex);
        startActivity(context, bundle, intent);

Я получаю нулевое значение для "правил" в целевой деятельности. Что здесь происходит не так. Может ли кто-нибудь помочь.

1 Ответ

0 голосов
/ 13 мая 2018

Для такого рода проблем я всегда предпочитаю использовать библиотеку Gson.Вот мое решение для этого.

импорт библиотеки gson.

compile 'com.google.code.gson:gson:2.7'

преобразование вашего вложенного Arraylist в строку с использованием gson в вашем классе адаптера.

Gson gson = new Gson();
Intent intent = new Intent(context, RulesDetailActivity.class);
intent.putExtra("rules", gson.toJson(ruleList);
startActivity(intent);

после этогов классе RulesDetailActivity сделайте это:

Gson gson = new Gson();
String gson = getIntent().getStringExtra("rules");
Type type = new TypeToken<List<Rule>>() {
            }.getType();
ArraList<Rule> rules = gson.fromGson(gson, type);
...