android - 从 json 获取一次数据并在 3 个 fragment 中使用它

标签 android json android-fragments pass-data

我使用volley从JSON获取数据,Activity中有3个Fragment,我必须用数据填充这些 fragment 我从 MainActivity 中的 JSON 收到的。我想从 JSON 获取一次数据,并在 Activity 和所有这 3 个 Fragment 中使用它。我将收到的数据放入 List 中,如下所示:

List<Display_Activity_Model> videoDetailList;

我使用如下接口(interface)将此列表从 Activity 发送到其他 fragment :

在 Activity 中我有这个方法:

@Override
public List<Display_Activity_Model> getDataList() {
    return videoDetailList;
}

在我的一个 fragment 中:

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

当我调试代码时,我发现在使用volley获取json的方法之前调用了MainActivity中的方法getDataList。所以我一直收到空列表。

我的问题是:一次 Volley 获取数据并在其他 fragment 中使用它的最佳方法是什么?

更新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) {

        }
    });

问题是 fragment 中的方法“onCreateView”在更新方法之前被调用。当我将更新方法声明为静态时,它也是相同的,并且变量“dataListFromDispAct”始终为空。

更新2:

Debugging result

更新3: @Piyush

我实现了您的回复,但在这个问题上不起作用。我得到空列表,因为方法 onCreateView 执行早于 Activity 中的 getItemMenuGson 方法。我声明:

SharedApplication mapp = SharedApplication.getInstance();
ArrayList<String> myList = mapp.getArrayListData();

在fragment中的onActivityCreated中,但它也在Activity中的getItemMenuGson方法之前运行。方法调用的顺序:

method's running order

我该怎么办?如何在 Activity 中调用 getItemMenuGson 方法来获取 JSON,然后加载 fragment 布局以将这些加载的数据填充到 fragment 中?

解决方案:问题的关键是首先运行的静态方法:

Fragment中定义以下代码:

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

    }

最佳答案

为了在调用API后将数据从activity发送到fragment,您可以在fragment中创建一个方法update()来接收数据,并在loadData finish()时调用activity中的fragment.update()。

new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        //Parse resonse to *videoDetailList*
        fragment.update(videoDetailList);
    }
}

关于android - 从 json 获取一次数据并在 3 个 fragment 中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39630216/

相关文章:

android - 在 opengl-es 中使用 2D 正交投影时从未得到完整的 480*800

java - 将图钉放置在 fragment 中的 map fragment 上

android - 与 getChildFragmentManager() 的共享转换不起作用但与 getFragmentManager() 一起工作

Android Media Player 挂起或返回 null

java - 如何在ListView中存储ID并在android java中显示类似<option value ="id">data</option>的数据

java - 将 REST\json httpclient4.2 切换为正常的 HttpURLConnection

ios - Swift:REST JSON Get 请求带身份验证

javascript - 如何在 JavaScript localStorage 中存储(字典)对象?

android - 将日期保存到共享首选项

android - 在 onClick 之后正确更新 RealmModel,而不阻塞 Android 中的 UI