【问题标题】:pass array of model objects to Fragment将模型对象数组传递给片段
【发布时间】:2014-01-28 10:02:31
【问题描述】:

我的应用程序正在从服务器接收 json,并且基于此我正在使用来自 google 的 gson 库创建模型(json 字符串直接映射到 java 对象表示)。然后我需要将数组中的几个相同模型传递给 Fragment 以从中创建视图。由于 Fragments 具有静态构造函数并且可以通过 Bundle 对象传递参数,我该如何实现它。 这是一个非常简单的模型,它将与另一个数组一起传递:

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

这是我想要接收模型数组并对其进行处理以创建视图的片段:

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

}

解决该问题的最佳方法是什么? 提前致谢!

【问题讨论】:

    标签: java android arrays json android-fragments


    【解决方案1】:

    解决方案一

    您可以创建可以保存数据的 Json 对象,而不是将 Json 对象转换为 java 类。因此,您可以通过活动和片段传递您的数据(如字符串)

    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, "");
    }
    }
    

    之后,您可以创建包含 SingleHomeCardItem 实例列表的更复杂的类

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

    所以你可以像字符串一样传递数据

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

    }

    解决方案 2

    创建一个 AcountCards 类但不扩展 JsonObject 但实现 Parcable 接口并使用 getParcelableExtra() 像 this

    解决方案 3

    创建一个 AcountCards 类但不扩展 JsonObject 但实现 Serialiazible 接口并使用 getSerializableExtra() 像 this

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      相关资源
      最近更新 更多