如何将数组列表作为参数传递给片段并检索它

时间:2016-11-12 09:05:14

标签: android android-fragments arguments

我正在尝试将ArrayList<DataField>作为参数传递给片段,但无法理解我应该使用哪种方法。

我正在使用bundle将参数发送到像这样的片段

bundle.putSerializable(Constants.ARRAY_DATA, dataArray);

当我尝试使用

获取Fragment中的参数时
getArguments().getSerializable(Constants.ARRAY_DATA)

我收到错误

  

不兼容的类型。必需:java.util.ArrayList    实测:   了java.io.Serializable“

getArguments().getParcelable(Constants.ARRAY_DATA);

没有显示任何错误,但

bundle.putParcelable(Constants.ARRAY_DATA, dataArray);

显示错误

  

错误的第二个参数类型。实测:   '的java.util.ArrayList',   必需:'android.os.Parcelable'

putParcelable (串, android.os.Parcelable) 在Bundle中无法应用 至 (串, java.util.ArrayList中)

我应该使用哪种方法通过捆绑包发送自定义数据字段的数据列表并使用参数进行检索?

1 个答案:

答案 0 :(得分:1)

通过bundle传递原始数据类型很容易,因为它们具有预定义的方法。简单地说,将数据放入唯一键并将其发送到另一个活动或片段。但是如果用户想要通过bundle或Intents发送自定义对象,Data field类应该实现Parcelable接口。

您还可以使用Serializable,Parceler,GSON ......所有Parcelable都是写入和读取对象的最快方式。

下面我们将看到 Parcelable 的实现,最后是如何使用它传递数据。

第1步:使用 Parcelable

实施DataField类
public class DataField implements Parcelable {

第2步:使用parcel方法中的writeToParcel对象将所有实例变量保存在DataField类中。

public void writeToParcel(Parcel parcel, int i) {
    parcel.writeString(itemName);
    parcel.writeString(itemUrl);
}

第3步:文档说

  

实现Parcelable接口的类也必须具有   名为CREATOR的非空静态字段,用于实现   Parcelable.Creator界面。

因此,我们需要实现此接口来读取Parcelable。

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

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

第4步:查看createFromParcel方法中的return语句。我们有一个构造函数(DataField(in)),我们之前没有在类中定义过。现在,我们将实现此构造函数,并还原我们之前保存的所有数据。

private DataField(Parcel in) {
    itemName = in.readString();
    itemUrl = in.readString();
}

确保以相同的顺序读取所有变量。否则,您最终会在错误的变量中存储错误的值。

第5步:返回活动,只需使用

即可
bundle.putParcelableArrayList(Constants.ARRAY_DATA, dataArray);

第6步:在片段内部,使用参数和getParcelableArrayList方法获取数据数组

dataArray = getArguments().getParcelableArrayList(Constants.ARRAY_DATA);

您可以使用相同的步骤将ArrayList<DataField>传递给意图和putParcelableArrayListgetParcelableArrayList