【发布时间】:2017-01-30 12:15:09
【问题描述】:
我正在使用 volley 从 JSON 获取数据,Activity 中有 3 个 Fragment,我必须使用从 JSON 中的 MainActivity 收到的数据填充这些片段。我想从JSON 获取一次数据并在Activity 和所有这3 个Fragment 中使用它。我将收到的数据放在List 中,如下所示:
List<Display_Activity_Model> videoDetailList;
我使用如下接口将此列表从活动发送到其他片段:
在活动中我有这个方法:
@Override
public List<Display_Activity_Model> getDataList() {
return videoDetailList;
}
在我拥有的片段之一中:
public interface GetDataInterface {
List<Display_Activity_Model> getDataList();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
sGetDataInterface= (GetDataInterface) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString() + "must implement GetDataInterface Interface");
}
}
@Override
public void onResume() {
super.onResume();
if(sGetDataInterface != null){
dataListFromDispAct = sGetDataInterface.getDataList();
}
}
当我调试代码时,我看到MainActivity 中的方法getDataList 在使用volley 获取json 的方法之前被调用。所以我一直收到空列表。
我的问题是:使用 volley 一次获取数据并将其用于其他片段的最佳方法是什么?
更新1:
@Keita Junichiro:
我在 fragment 中定义了“更新”方法,例如:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.video_info,container,false);
initComponents(view);
if (dataListFromDispAct != null) {
txt_view_count.setText(dataListFromDispAct.get(0).getView_count());
}
return view;
}
public void update(List<Display_Activity_Model> videoDetailList){
dataListFromDispAct=videoDetailList;
}
在“getItemMenuGson”方法中加载 json 之后,我在 activity 中调用“update”方法:
getItemMenuGson(new CallBack() {
@Override
public void onSuccess(List<Display_Activity_Model> itemMenuGsonList) {
videoDetailList=itemMenuGsonList;
new Video_Info().update(videoDetailList);
}
@Override
public void onFail(String msg) {
}
});
问题是在更新方法之前调用片段中的方法“onCreateView”。当我声明更新方法为静态时,它也是相同的,并且变量“dataListFromDispAct”一直为空。
更新2:
更新 3: @Piyush
我实现了您的响应,但它在这个问题上不起作用。我得到空列表,因为方法 onCreateView 执行早于 Activity 中的 getItemMenuGson 方法。我声明:
SharedApplication mapp = SharedApplication.getInstance();
ArrayList<String> myList = mapp.getArrayListData();
onActivityCreated 在片段中,但它也在 Activity 中的 getItemMenuGson 方法之前运行。方法调用的顺序:
我该怎么办?如何在 Activity 中调用 getItemMenuGson 方法来获取 JSON,然后加载片段布局以将这些加载的数据填充到片段中?
解决方案:问题的关键是首先运行的静态方法:
在片段中定义以下代码:
public class Video_Info extends Fragment {
static TextView txt_view_count;
List<Display_Activity_Model> dataListFromDispAct;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view=inflater.inflate(R.layout.video_info,container,false);
txt_view_count= (TextView) view.findViewById(R.id.txt_view_count);
return view;
}
public static void update(List<Display_Activity_Model> videoDetailList)
{
txt_view_count.setText(videoDetailList.get(0).getView_count());
}
}
在Activity中从JSON获取数据后调用更新方法:
getItemMenuGson(new CallBack() {
@Override
public void onSuccess(List<Display_Activity_Model> itemMenuGsonList) {
videoDetailList = itemMenuGsonList;
//////////////////
Video_Info.update(videoDetailList);
///////////////////
Uri vidUri = Uri.parse(itemMenuGsonList.get(0).getMedia().getURL());
vidView.setVideoURI(vidUri);
}
【问题讨论】:
-
在
Application单调类中为arraylist 实现Getter-Setter方法,并在解析后将您的arraylist 设置为主要活动。之后在每个片段中,您可以通过单音类访问它。 -
你能解释一下你的答案吗?
-
检查我的答案并告诉我
-
好的,试着告诉我。它会起作用的。
-
为什么不使用 EventBus?
标签: android json android-fragments pass-data