简体   繁体   中英

how to communicate between class and a fragment. i have created a class that i want it perform network request an return an arraylist

I have craeted a class named as EventService ,the function of the class is to perform a network request using volley and return the result as Arraylist of class type Eventlist, the volley response is then used as a parameter in intilizing the recyclerview adapter. i'm looking for an assistance on how to work out. i have tried the code below and my app keeps on crashing.

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

You can use interface callbacks to return your results to the fragment:

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

this is a gist of how this can be done with callbacks. You can find more samples similar to this. Feel free to ask if you need more clarification

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM