从json获取数据并在3个片段

时间:2016-09-22 04:22:08

标签: android json android-fragments pass-data

我使用排球从JSON获取数据,Fragment中有3 Activity我必须使用{{1}收到的数据填充这些片段在JSON中。我想从MainActivity获取一次数据并在JSON和所有3 Activity中使用它。我将收到的数据放在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(); } } 中的方法getDataList在使用volley获取json的方法之前被调用。所以我一直收到空列表。

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

UPDATE1:

@Keita Junichiro:

我定义了&#34;更新&#34; 片段中的方法,如:

MainActivity

我打电话给#34;更新&#34; json加载到&#34; getItemMenuGson&#34;之后活动中的方法方法:

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

}

问题是方法&#34; onCreateView&#34;在更新方法之前调用片段。当我声明更新方法静态时,它也是相同的和变量&#34; dataListFromDispAct&#34;一直都是空的。

UPDATE2:

Debugging result

更新3: @Piyush

我实施了您的回复,但它无法解决此问题。我得到空列表,因为方法onCreateView比Activity中的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) {

        }
    });

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

method's running order

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

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

片段中定义以下代码:

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

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

首先制作一个单音应用类

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;

}

}

现在,您的活动使用

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

在onCreate()方法中初始化

mApp = SharedApplication.getInstance();

现在从arraylist

中解析服务器集数据中的数据
mApp.setArrayListData(yourArrayList);

现在,无论何时想要获取任何片段的数据,你都应该在你想要获得arraylist的每个片段中初始化你的应用程序类。

像,

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

注意:您必须在清单中将SharedApplication类添加到application代码

答案 2 :(得分:0)

使用方法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
    }
    ...
    ...
}

希望有所帮助