首页 > 解决方案 > 如何在类和片段之间进行通信。我创建了一个类,我希望它执行网络请求并返回一个数组列表

问题描述

我创建了一个名为 EventService 的类,该类的功能是使用 volley 执行网络请求并将结果作为类类型 Eventlist 的 Arraylist 返回,然后将 volley 响应用作 intilizing recyclerview 适配器的参数。我正在寻找有关如何锻炼的帮助。我已经尝试了下面的代码,但我的应用程序不断崩溃。

public class Extra extends Fragment {

    ArrayList<EventList> eventLists=new ArrayList<>();



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        Eventservice eventservice=new Eventservice(getContext());
        eventLists=eventservice.getEventLists();
        View view=inflater.inflate(R.layout.eventrecyclerview, container, false);
        RecyclerView recyclerView=view.findViewById(R.id.recyclerview);
        EventAdapter eventAdapter=new EventAdapter(getContext(),eventLists);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(eventAdapter);

        // Inflate the layout for this fragment
        return  view;
    }
}


public class Eventservice {
    Context context;
    ArrayList<EventList> eventLists=new ArrayList<>();
    String url="https://ipAddress/stdportal/events/getAllevents.php";
    JSONObject event;
    private static final String TAG = "Eventservice";

    public Eventservice(Context context) {
        this.context = context;

    }

    public ArrayList<EventList> getEventLists() {
        JsonArrayRequest jsonArrayRequest=new JsonArrayRequest(Request.Method.POST, url, null, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {

                int count=0;
                while (count<=response.length())
                {
                    try {
                       event =response.getJSONObject(count);
                        EventList eventList=new EventList(
                                                                event.getString("date"),
                                                                event.getString("venue"),
                                                                event.getString("eventdescription"),
                                                                event.getString("eventtittle")
                                                          );

                        eventLists.add(eventList);
                        count++;

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }



            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();

            }
        });
        Mysigleton.getInstance(context).addRequest(jsonArrayRequest);
        return eventLists;
    }
}

标签: javaandroid

解决方案


您可以使用接口回调将结果返回到片段:

  public class Extra extends Fragment implements EventService.NetworkResult {

        ArrayList<EventList> eventLists=new ArrayList<>();

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            Eventservice eventservice=new Eventservice(getContext(),this);
            View view=inflater.inflate(R.layout.eventrecyclerview, container, false);
            RecyclerView recyclerView=view.findViewById(R.id.recyclerview);
            EventAdapter eventAdapter=new EventAdapter(getContext(),eventLists);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
            recyclerView.setAdapter(eventAdapter);

            // Inflate the layout for this fragment
            return  view;
        }

      @Override
      void onSuccess(List<EventList> eventList){
      eventLists.addAll(eventList);
      eventAdapter.notifyDatasetchanged();
      }
      @Override
     void onError(VolleyError error){
    //update UI for errors
      }

    }


        public class Eventservice {
            NetworkResult networkResult;
            Context context;
            ArrayList<EventList> eventLists=new ArrayList<>();
            String url="https://ipAddress/stdportal/events/getAllevents.php";
            JSONObject event;
            private static final String TAG = "Eventservice";

            public Eventservice(Context context,NetworkResult networkResult) {
                this.context = context;
                 this.networkResult = networkResult;
            }

            public void getEventLists() {
                JsonArrayRequest jsonArrayRequest=new JsonArrayRequest(Request.Method.POST, url, null, new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {

                        int count=0;
                        while (count<=response.length())
                        {
                            try {
                               event =response.getJSONObject(count);
                                EventList eventList=new EventList(
                                                                        event.getString("date"),
                                                                        event.getString("venue"),
                                                                        event.getString("eventdescription"),
                                                                        event.getString("eventtittle")
                                                                  );

                                eventLists.add(eventList);
                                count++;
                             networkResult.onSuccess(eventLists);

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }



                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        error.printStackTrace();
                        networkResult.onError(error);
                    }
                });
                Mysigleton.getInstance(context).addRequest(jsonArrayRequest);
                return eventLists;
            }

          interface NetworkResult{
            void onSuccess(List<EventList> eventList);
             void onError(VolleyError error);
          }
        }

这是如何使用回调完成此操作的要点。您可以找到更多与此类似的示例。随时询问您是否需要更多说明


推荐阅读