-1

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;
    }
}
cyrus
  • 19
  • 2
  • It's very difficult to debug a crash without a stack trace. See [Unfortunately MyApp has stopped. How can I solve this?](/q/23353173) for Android-specific advice, and [What is a stack trace, and how can I use it to debug my application errors?](/q/3988788) for advice on what to do once you have the stack trace. If you still need help, edit your question to include the **complete stack trace**, as well as **which line of your code** the stack trace points to. – Ryan M Mar 31 '21 at 02:20

1 Answers1

0

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

p.mathew13
  • 920
  • 8
  • 16