使用自定义对象数组列表实例化片段

Instantiate a fragment with a Custom Object Array List

我正在尝试实例化一个片段 "sending" 一个自定义对象数组列表,但我找不到执行此操作的确切方法。我想我可能不得不使用 SerializableParcelable(如另一个答案所示),但即使在阅读该答案后我也不确定如何实施它。

有人可以帮助我吗?提前致谢。

实例化代码

Fragment f = new Fragment();

ArrayList<IconsCategory> category = Utils.getCategory();
ArrayList<IconItem> icons = category.getIconsArray();

f = IconsFragment.newInstance(icons);

return f;

片段中用于创建实例的代码: 我知道 args.putArrayList() 方法不存在,我只是写它来展示我希望如何编写它。

public static IconsFragment newInstance(ArrayList<IconItem> list) {
    IconsFragment fragment = new IconsFragment();
    Bundle args = new Bundle();
    args.putArrayList(list);   // here's where the code is supposed to go 
    fragment.setArguments(args);
    return fragment;
}

图标类别class:

import java.util.ArrayList;

public class IconsCategory {

    private String name;
    private ArrayList<IconItem> iconsArray = new ArrayList<>();

    public IconsCategory(String name, ArrayList<IconItem> iconsArray) {
        this.name = name;
        this.iconsArray = iconsArray;
    }

    public String getCategoryName() {
        return this.name;
    }

    public ArrayList<IconItem> getIconsArray() {
        return iconsArray.size() > 0 ? this.iconsArray : null;
    }

}

IconItem class:

public class IconItem {

    private String name;
    private int resId;

    public IconItem(String name, int resId){
        this.name = name;
        this.resId = resId;
    }

    public String getName(){
        return this.name;
    }

    public int getResId(){
        return this.resId;
    }

}

在 IconItem 中实现可序列化 class:

import java.io.Serializable;

public class IconItem implements Serializable {

    private String name;
    private int resId;

    public IconItem(String name, int resId){
        this.name = name;
        this.resId = resId;
    }

    public String getName(){
        return this.name;
    }

    public int getResId(){
        return this.resId;
    }

}

然后

public class IconsFragment extends Fragment {
    public static final String KEY = "key";
    public static IconsFragment newInstance(ArrayList<IconItem> list) {
        IconsFragment fragment = new IconsFragment();
        Bundle args = new Bundle();
        args.putSerializable(KEY, list);
        fragment.setArguments(args);
        return fragment;
    }
}

ArrayList 默认实现了 Serializable,所以你只需要在你的 classes 中实现它。

另一种选择是创建一个 Listener 接口,然后简单地 "listen" 获取 onCreateonResumeFragment 中的最新列表

这是我的实现示例,如果您需要帮助查看这些片段,请告诉我:https://goo.gl/gNJFTV

注意 MainActivityDailyViewFragment

GetLogListener 的实现

您应该避免使用 Serializable,实现 Parcelable 是 Android (http://developer.android.com/reference/android/os/Parcelable.html) 上的首选路径:

IconItem.java

import android.os.Parcel;
import android.os.Parcelable;

public class IconItem implements Parcelable {

    private String name;
    private int resId;

    public IconItem(String name, int resId) {
        this.name = name;
        this.resId = resId;
    }

    public String getName() {
        return this.name;
    }

    public int getResId() {
        return this.resId;
    }

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

    @Override public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(resId);
    }

    public static final Creator<IconItem> CREATOR = new Creator<IconItem>() {
        @Override
        public IconItem createFromParcel(Parcel in) {
            String name = in.readString();
            int redId = in.readInt();
            return new IconItem(name, redId);
        }

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

IconsCategory.java

import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;

public class IconsCategory implements Parcelable {

    private String name;
    private ArrayList<IconItem> iconsArray = new ArrayList<>();

    public IconsCategory(String name, ArrayList<IconItem> iconsArray) {
        this.name = name;
        this.iconsArray = iconsArray;
    }


    public static final Creator<IconsCategory> CREATOR = new Creator<IconsCategory>() {
        @Override
        public IconsCategory createFromParcel(Parcel in) {
            String name = in.readString();
            ArrayList<IconItem> icons = new ArrayList<>();
            in.readTypedList(icons, IconItem.CREATOR);
            return new IconsCategory(name, icons);
        }

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

    public String getCategoryName() {
        return this.name;
    }

    public ArrayList<IconItem> getIconsArray() {
        return iconsArray.size() > 0 ? this.iconsArray : null;
    }

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

    @Override public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeTypedList(iconsArray);
    }
}

IconsFragment.java

public static IconsFragment newInstance(IconsCategory category) {
    IconsFragment fragment = new IconsFragment();
    Bundle args = new Bundle();
    args.putParcelable("category", category); 
    fragment.setArguments(args);
    return fragment;
}

这将创建您的新 Fragment,并允许您在创建 Fragment 时传入 ArrayList。有了这个,你不必让所有东西都可以打包。如果您希望能够来回传递 POJO,那么使用 Parcelable 因为 Serializable 没有帮助,因为您会得到更复杂的 POJO 结构。 Parcelable 也有更好的性能。

public IconsFragment extends Fragment {

    private ArrayList<IconItem> list;

    /** Blank constructor */
    public IconsFragment() {}

    public static IconsFragment createFragment(@Nullable ArrayList<IconItem> list) {
        IconsFragment frag = new IconsFragment();
        frag.init(list);
        return frag;
    }

    public void init(ArrayList<IconItem> list) {
        if (list==null) {
            this.list = new ArrayList<>(0);
        } else {
            // This creates a new list coping your values into the new array
            this.list = new ArrayList<>(list);
            // Or this just uses your current list.
            // JUST PICK ON OR THE OTHER.
            this.list = list;
        }
    }
}