【问题标题】:Getting data from json once and use it in 3 fragment一次从 json 获取数据并在 3 个片段中使用它
【发布时间】: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


【解决方案1】:

为了在调用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);
    }
}

【讨论】:

  • 您可以修改方法更新,检查片段isVisible并设置txt_view_count的值: if (isVisible() && videoDetailList != null && videoDetailList.size() > 0){txt_view_count.setText(dataListFromDispAct.get (0).getView_count());}
  • 它不工作,视图在那里,但 isVisible() 始终为假,我将 update 内的代码更改为 if (videoDetailList != null && videoDetailList.size() > 0) { txt_view_count.setText(dataListFromDispAct.get(0).getView_count());并且条件变为真,但应用程序崩溃了。我认为我们不能在 onCreateView 之外使用“txt_view_count.setText()”。我也测试了这个 txt_view_count.setText("2");又崩溃了。
  • initComponents(view);好好工作?你能在 initComponents(view); 之后检查 txt_view_count == null 吗?如果fragment.isVisible(),则onCreateView已经调用,所以txt_view_count不为空。
【解决方案2】:

首先制作一个单例应用类

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

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

喜欢,

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

注意:您必须将清单中的SharedApplication 类添加到application 标记

【讨论】:

    【解决方案3】:

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

    希望对你有帮助

    【讨论】:

    • 你是说:“现在用 Volley 在 Fragment 中获取数据”我应该在 Fragment 还是 Activity 中获取?
    猜你喜欢
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多