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执行此操作?请正确查看<