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

Java 使用自定义对象数组列表实例化片段,java,android,android-fragments,arraylist,instance,Java,Android,Android Fragments,Arraylist,Instance,我试图实例化一个片段“发送”一个自定义对象数组列表,但找不到确切的方法。我想我可能必须使用Serializable或Parcelable(如另一个答案所示),但即使在阅读了该答案之后,我也不确定如何实现它 有人能帮我吗?提前谢谢 要实例化的代码 Fragment f = new Fragment(); ArrayList<IconsCategory> category = Utils.getCategory(); ArrayList<IconItem> icons =

我试图实例化一个片段“发送”一个自定义对象数组列表,但找不到确切的方法。我想我可能必须使用
Serializable
Parcelable
(如另一个答案所示),但即使在阅读了该答案之后,我也不确定如何实现它

有人能帮我吗?提前谢谢

要实例化的代码

Fragment f = new Fragment();

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

f = IconsFragment.newInstance(icons);

return f;
IConCategory类别:

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类中实现可序列化:

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;
    }

}
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;
    }

}
然后

公共类IconsFragment扩展了片段{
公共静态最终字符串KEY=“KEY”;
公共静态IconsFragment新实例(ArrayList列表){
IconsFragment fragment=新的IconsFragment();
Bundle args=新Bundle();
args.putSerializable(键,列表);
fragment.setArguments(args);
返回片段;
}
}

默认情况下,ArrayList实现可序列化,因此您只需要在类中实现它。

在IconItem类中实现可序列化:

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;
    }

}
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;
    }

}
然后

公共类IconsFragment扩展了片段{
公共静态最终字符串KEY=“KEY”;
公共静态IconsFragment新实例(ArrayList列表){
IconsFragment fragment=新的IconsFragment();
Bundle args=新Bundle();
args.putSerializable(键,列表);
fragment.setArguments(args);
返回片段;
}
}

默认情况下,ArrayList实现可序列化,因此您只需要在类中实现它。

另一个选项是创建一个侦听器接口,然后在
onCreate
onResume
等中的
片段中“侦听”最新列表

以下是我的实现示例,如果您需要帮助查看片段,请告诉我:


注意
MainActivity
DailyViewFragment
中的
GetLogListener
的实现。另一个选项是创建一个监听器界面,然后在
onCreate
onResume
中简单地“侦听”最新的
片段列表

以下是我的实现示例,如果您需要帮助查看片段,请告诉我:


请注意
MainActivity
DailyViewFragment

中的
GetLogListener
的实现。您应该避免使用Serializable,在Android()上实现Parcelable是首选路径:

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];
        }
    };
}

您应该避免使用Serializable,在Android()上实现Parcelable是首选路径:

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];
        }
    };
}

这将创建新片段,并允许您在创建片段时传入ArrayList。有了这个,你不必把所有东西都打包。如果您希望能够来回传递POJO,那么使用Parcelable as 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;
        }
    }
}
公共IConFragment扩展了片段{
私有数组列表;
/**空白构造函数*/
公共IconsFragment(){}
公共静态IconsFragment createFragment(@Nullable ArrayList列表){
IconsFragment frag=新的IconsFragment();
框架初始(列表);
返回碎片;
}
公共void init(ArrayList列表){
if(list==null){
this.list=newarraylist(0);
}否则{
//这将创建一个新列表,将您的值添加到新数组中
this.list=新的ArrayList(列表);
//或者只使用您当前的列表。
//随便挑吧。
this.list=列表;
}
}
}

这将创建新片段,并允许您在创建片段时传入ArrayList。有了这个,你不必把所有东西都打包。如果您希望能够来回传递POJO,那么使用Parcelable as 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;
        }
    }
}
公共IConFragment扩展了片段{
私有数组列表;
/**空白构造函数*/
公共IconsFragment(){}
公共静态IconsFragment createFragment(@Nullable ArrayList列表){
IconsFragment frag=新的IconsFragment();
框架初始(列表);
返回碎片;
}
公共void init(ArrayList列表){
if(list==null){
this.list=newarraylist(0);
}否则{
//这将创建一个新列表,将您的值添加到新数组中
this.list=新的ArrayList(列表);
//或者只使用您当前的列表。
//随便挑吧。
this.list=列表;
}
}
}

但它要求我实现两种方法,我不知道该在其中添加什么。谢谢。顺便说一句,现在我需要将该值赋给片段代码中的一个新ArrayList变量。。。我正在使用getArguments().getSerializable(键)。。。但上面写着“不兼容类型”。必需:ArrayList。已找到:可序列化“。。。。我现在应该怎么做?试试:list=(ArrayList)bundle.getSerializable(KEY);它不显示错误,但显示“未选中的强制转换”。我应该担心吗?这只是警告。您可以在语句之前使用@SuppressWarnings(“unchecked”)来删除它。但是它要求我实现两个方法,我不知道应该在其中添加什么。谢谢。顺便说一句,现在我需要将该值赋给片段代码中的一个新ArrayList变量。。。我正在使用getArguments().getSerializable(键)。。。但上面写着“不兼容类型”。必需:ArrayList。已找到:可序列化“。。。。我现在应该怎么做?试试:list=(ArrayList)bundle.getSerializable(KEY);它不显示错误,但显示“未选中的强制转换”。我应该担心吗?这只是警告。您可以在语句之前使用@SuppressWarnings(“unchecked”)将其删除。但这会向片段发送一个IconCategory,我需要发送一个ArrayList如何使用parcelable执行此操作?请正确查看<