1

My app is receiving json from server and based on that I'm creating models using gson library from google (json string mapped directly to java object representation). Then I need to pass few of the same models in array to the Fragment to create view out of that. How can I achieve it since Fragments have static constructor and arguments can be passed via Bundle object. This is very simple model which will be passed in array with another:

public class SingleHomeCardItem {
    private String title;
    private String subtitle;
    private String badgeNumber;
    private String backgroundUrl;
    private String backgroundGradient;
    private String targetUrl;
    private String target;
    private String row;

    public String getTitle() {
        return title;
    }

    public String getSubtitle() {
        return subtitle;
    }

    public String getBadgeNumber() {
        return badgeNumber;
    }

    public String getBackgroundUrl() {
        return backgroundUrl;
    }

    public String getBackgroundGradient() {
        return backgroundGradient;
    }

    public String getTargetUrl() {
        return targetUrl;
    }

    public String getTarget() {
        return target;
    }

    public String getRow() {
        return row;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setSubtitle(String subtitle) {
        this.subtitle = subtitle;
    }

    public void setBadgeNumber(String badgeNumber) {
        this.badgeNumber = badgeNumber;
    }

    public void setBackgroundUrl(String backgroundUrl) {
        this.backgroundUrl = backgroundUrl;
    }

    public void setBackgroundGradient(String backgroundGradient) {
        this.backgroundGradient = backgroundGradient;
    }

    public void setTargetUrl(String targetUrl) {
        this.targetUrl = targetUrl;
    }

    public void setTarget(String target) {
        this.target = target;
    }

    public void setRow(String row) {
        this.row = row;
    }
}

And here's the fragment that I want to receive the array of that models and process it to create view:

public class HomeshelfFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = createView(inflater, container, getArguments().????);
        return v;
    }

    public static HomeshelfFragment newInstance(SingleHomeCardItem[] items) {

        HomeshelfFragment f = new HomeshelfFragment();
        Bundle b = new Bundle();
        // ?????
        f.setArguments(b);

        return f;
    }

    private View createView(LayoutInflater inflater, ViewGroup container, SingleHomeCardItem[] items) {
        View v = inflater.inflate(R.layout.home_card_3_items, container, false);
        // add views to the inflated view based on models data
        return v;
    }

}

What is the best approach to that problem? Thanks in advance!

lukaleli
  • 3,427
  • 3
  • 22
  • 32

1 Answers1

2

Solution 1

instead transforming the Json Objects to java classes you can create Json objects that can hold your data. Hence u can pass your data like strings through activities and fragments

public class SingleHomeCardItem extends JSONObject {
private static final String TAG = SingleHomeCardItem.class.getSimpleName();

public static final String subtitle = "subtitle";
public static final String badgeNumber = "badgeNumber";
public static final String backgroundUrl = "backgroundUrl";
public static final String backgroundGradient = "backgroundGradient";
public static final String targetUrl = "targetUrl";
public static final String target = "target";
public static final String row = "row";

public SingleHomeCardItem(String json) throws JSONException {
    super(json);
}

public SingleHomeCardItem(JSONObject json) throws JSONException {
    super(json.toString());
}

public String getSubtitle() {
    return optString(subtitle, "");
}

public String getBadgeNumber() {
    return optString(badgeNumber, "");
}

public String getBackgroundUrl() {
    return optString(backgroundUrl, "");
}

public String getBackgroundGradient() {
    return optString(backgroundGradient, "");
}

public String getTargetUrl() {
    return optString(targetUrl, "");
}

public String getTarget() {
    return optString(target, "");
}
public String getRow() {
    return optString(row, "");
}
}

after that you can create more complex class that contatins a list of SingleHomeCardItem instances

public class AccountData extends JSONObject {

  private static final String TAG=AccountData.class.getSimpleName();

  private static final String ACOUNT_CARDS="SingleHomeCardItemList";

  public AccountData(String json) throws JSONException {
        super(json);
        }

        public AccountData(JSONObject json) throws JSONException {
            super(json.toString());
        }

        public ArrayList<SingleHomeCardItem> getAcountCards() throws JSONException {

            ArrayList<SingleHomeCardItem> cardsArray = new ArrayList<SingleHomeCardItem>();
            JSONArray cardsJSONArray = optJSONArray(ACOUNT_CARDS);


            if(!optString(ACOUNT_CARDS).equals("null")){
                 for(int i=0; i<cardsJSONArray.length(); i++) {
                        cardsArray.add(new          SingleHomeCardItem(cardsJSONArray.getString(i)));
                        }
            }

            return cardsArray;
            }

So you can pass the data like Strings

public class HomeshelfFragment extends Fragment {

public static final String KEY_DATA = "KEY_DATA";
private ArrayList<SingleHomeCardItem> myCards;



public static HomeshelfFragment newInstance(String data) {

    HomeshelfFragment f = new HomeshelfFragment();
    Bundle b = new Bundle();
    b.putString(KEY_DATA, data);
    f.setArguments(b);

    return f;
}

private View createView(LayoutInflater inflater, ViewGroup container, SingleHomeCardItem[] items) {
        View v = inflater.inflate(<your layout>, container, false);

        String dataString = this.getArguments().getString(KEY_DATA, "");

    AccountData data = null;

        myCards = new ArrayList<SingleHomeCardItem>();
    try {
        data = new AccountData(datastring);
    } catch (JSONException e) {

        e.printStackTrace();
    }


    try {
                  // a list with your SingleHomeCardItem instances
        myCards = data.getAcountCards();

    } catch (JSONException e) {

        e.printStackTrace();
    }
         // add views to the inflated view based on models data
    return v;
}

}

Solution 2

create an AcountCards class but without extending the JsonObject but implementing the Parcable interface and use getParcelableExtra() like this

Solution 3

create an AcountCards class but without extending the JsonObject but implementing the Serialiazible interface and use getSerializableExtra() like this

Community
  • 1
  • 1
Chris
  • 1,641
  • 1
  • 16
  • 17