使用自定义对象数组列表实例化片段
Instantiate a fragment with a Custom Object Array List
我正在尝试实例化一个片段 "sending" 一个自定义对象数组列表,但我找不到执行此操作的确切方法。我想我可能不得不使用 Serializable
或 Parcelable
(如另一个答案所示),但即使在阅读该答案后我也不确定如何实施它。
有人可以帮助我吗?提前致谢。
实例化代码
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" 获取 onCreate
、onResume
等 Fragment
中的最新列表
这是我的实现示例,如果您需要帮助查看这些片段,请告诉我:https://goo.gl/gNJFTV
注意 MainActivity
和 DailyViewFragment
中 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;
}
}
}
我正在尝试实例化一个片段 "sending" 一个自定义对象数组列表,但我找不到执行此操作的确切方法。我想我可能不得不使用 Serializable
或 Parcelable
(如另一个答案所示),但即使在阅读该答案后我也不确定如何实施它。
有人可以帮助我吗?提前致谢。
实例化代码
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" 获取 onCreate
、onResume
等 Fragment
中的最新列表
这是我的实现示例,如果您需要帮助查看这些片段,请告诉我:https://goo.gl/gNJFTV
注意 MainActivity
和 DailyViewFragment
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;
}
}
}