I'm trying to instantiate a fragment "sending" a custom object array list, but I can't find the exact way to do it. I think I may have to use Serializable
or Parcelable
(as seen in another answer), but I'm not sure how to implement it even after reading that answer.
Can someone help me? Thanks in advance.
Code to instantiate
Fragment f = new Fragment();
ArrayList<IconsCategory> category = Utils.getCategory();
ArrayList<IconItem> icons = category.getIconsArray();
f = IconsFragment.newInstance(icons);
return f;
Code in fragment to create the instance:
I know args.putArrayList()
method doesn't exist, I just wrote it to show how I expect to be able to code it.
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;
}
IconsCategory 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;
}
}
You should avoid using Serializable, implementing Parcelable is is the preferred route on 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;
}