gpt4 book ai didi

java - 将模型对象数组传递给 Fragment

转载 作者:行者123 更新时间:2023-11-29 21:16:06 25 4
gpt4 key购买 nike

我的应用程序正在从服务器接收 json,并基于此我使用来自 google 的 gson 库创建模型(json 字符串直接映射到 java 对象表示)。然后我需要将数组中的几个相同模型传递给 Fragment 以从中创建 View 。我该如何实现它,因为 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;
}
}

这是我想要接收模型数组并处理它以创建 View 的 fragment :

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

}

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

最佳答案

解决方案一

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

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

方案二

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

方案三

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

关于java - 将模型对象数组传递给 Fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21402385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com