从 json 获取一次数据并在 3 个片段中使用它

Getting data from json once and use it in 3 fragment

我正在使用 volley 从 JSON 获取数据,Activity 中有 3 个 Fragment,我必须使用从 [=] 收到的数据填充这些片段19=] 在 MainActivity 中。我想从 JSON 获取一次数据,然后在 Activity 和所有这 3 个 Fragment 中使用它。我将接收到的数据放在 List 中,如下所示:

List<Display_Activity_Model> videoDetailList;

然后我使用如下接口将此列表从 activity 发送到其他片段:

在activity我有这个方法:

@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:

@凯塔纯一郎:

我在 片段 中定义了 "update" 方法,例如:

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

}

并且我在 activity 中调用 "update" 方法 json 在 "getItemMenuGson" 方法中加载后:

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" 始终为 null。

更新2:

更新 3: @Piyush

我实施了您的回应,但在这个问题上不起作用。我得到的列表是空的,因为 onCreateView 方法的执行时间早于 Activity 中的 getItemMenuGson 方法。我宣布:

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

在Activity片段中创建,但它也在Activity中的getItemMenuGson方法之前运行。方法调用的顺序:

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

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

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发送到片段,您可以在片段中创建一个方法update()来接收数据并在[中调用fragment.update() =14=] 当 loadData 完成时 ()。

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

先做一个单例应用class

public class SharedApplication extends Application{

ArrayList<String> arraylist;

public static SharedApplication instance=null;

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
}

public static SharedApplication getInstance()
{
    if(instance==null)
    {
        instance=new SharedApplication();
    }
    return instance;
}

public void setArrayListData(ArrayList<String> setData)
{
    arraylist=setData;
}

public ArrayList<String> getArrayListData()
{
    return arraylist;

}

}

现在在您的 activity 中使用

初始化您的应用程序 class
SharedApplication mApp; // declare global

在 onCreate() 方法中初始化

mApp = SharedApplication.getInstance();

现在从服务器中解析数据后,将数据设置到数组列表中

mApp.setArrayListData(yourArrayList);

现在,每当您想获取任何片段的数据时,您都应该在您想要获取数组列表的每个片段中同样初始化您的应用程序class。

喜欢,

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

注意:您必须在您的清单中添加 SharedApplication class 到 application 标签

使用方法创建接口 onDownloadComplete

public interface DelegateClass {
    public static onDownloadComplete(String jsonData);
}

现在 Activity 中使用 Volley 获取数据并调用此方法。在您的所有片段中实现此接口并覆盖 onDownloadComplete。当您的 Activity 完成获取数据时,将调用此方法。喜欢

public class YourFragment implements DelegateClass {
    ...
    ...
    @Override
    public static onDownloadComplete(String jsonData){
        //do what you want with data
    }
    ...
    ...
}

希望对您有所帮助