ArrayList 和 Parcelable

ArrayList and Parcelable

我需要 "transfer" 一个自定义的 ArrayList class 从一个实体到另一个实体。我知道我需要实现 Parcelable 接口。

这是我的习惯class。

public class cSportsList implements Parcelable {
    boolean checked;
    String name;

    cSportsList(boolean check, String name_) {
        checked = check;
        name = name_;
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        //Non posso passare un booleano e non posso fare il cast boolean -> int
        if (checked) {
            dest.writeInt(1);
        }
        else dest.writeInt(0);
        dest.writeString(name);
    }

    public static final Parcelable.Creator<cSportsList> CREATOR = new Parcelable.Creator<cSportsList>() {
        public cSportsList createFromParcel(Parcel in) {
            return new cSportsList(in);
        }

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

    private cSportsList(Parcel in) {
        if (in.readInt() == 1) {
            checked = true;
        }
        else {
            checked = false;
        }
        name = in.readString();


    }
}

这是实体中的代码 "from"

//This is sportsMap: ArrayList<cSportsList> sportsMap = new ArrayList<cSportsList>();
Intent intent = new Intent(getApplicationContext(),WhatSportActivity.class);
intent.putParcelableArrayListExtra("sportsMap", (ArrayList<? extends Parcelable>)  sportsMap);  //I have tried with ArrayList<cSportsList> too.
this.startActivity(intent);

这是实体中的代码 "to"

final Intent srcIntent = getIntent();
ArrayList<cSportsList> sportsMap = srcIntent.getParcelableExtra("sportsMap");

问题是:实体 "To" sportsMap 为空。 如果我在 "writeToParcel" 和 "cSportsList(Parcelable in)" 函数中设置 "breakpoint",我会看到代码针对这两个函数执行。

我的错误在哪里?

谢谢。 M.

阅读时需要使用

srcIntent.getParcelableArrayListExtra("sportsMap");

在下面的代码中使用Intent

intent.putParcelableArrayListExtra("sportsMap", sportsMap);

要从意图中读取它,请使用

ArrayList<cSportsList> sportsMap = srcIntent.getParcelableArrayListExtra("sportsMap");

Pass ArrayList<? implements Parcelable> to Activity

阅读类似的解决方案

你应该使用:

ArrayList<cSportsList> sportsMap = srcIntent.getParcelableArrayListExtra("sportsMap");

您也可以使用序列化。

public class cSportsList implements Serializable

放:

intent.putExtra("LIST",list);

获得:

(ArrayList<>)intent.getSerializableExtra("LIST");

使用下面的代码

sportsMap = srcIntent.getParcelableArrayListExtra("sportsMap");

尝试传递 Arraylist 而不是像这样转换它:

Intent intent = new Intent(getApplicationContext(),WhatSportActivity.class);
intent.putParcelableArrayListExtra("sportsMap", sportsMap);
        startActivity(intent);

在 WhatSportActivity 中,

final Intent srcIntent = getIntent();
ArrayList<cSportsList> sportsMap = srcIntent.getParcelableExtra("sportsMap");

如果您仍有问题,请尝试使用 "Parceable" 插件实现 Parceable,因为它减少了使用 Parceable 列表时的错误。