Возврат ArrayList из метода с использованием залпа - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь вернуть arrayList, когда я возвращаю arrayList пуст. Я буду использовать, когда я верну arrayList, но он не работает.

 public ArrayList<Cities> getCities(){
    final ArrayList<Cities> cities=new ArrayList<>();
    String url = "http://10.0.2.2:3000/cities";
    mQueue = Volley.newRequestQueue(context);
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        JSONArray jsonArray = response.getJSONArray("city");
                        for (int i = 0; i < jsonArray.length(); i++) {
                            JSONObject city = jsonArray.getJSONObject(i);
                            String id = city.getString("_id");
                            String name = city.getString("name");
                            Cities p=new Cities(id,name);
                            cities.add(p);
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });
    mQueue.add(request);
return cities;
}

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Если ваш ответ возвращает JSONObject с массивом элементов City, ваш запрос верен, но, как уже упоминалось выше, вы не можете ожидать, что получите результаты, пока не будет вызван обратный вызов. Вот пример, который использует JSONArrayRequest, который возвращает JSONArray, но в значительной степени работает так же, как ваш, после того как вы извлекли массив City из JSONObject.

    private ListView mTripList;
public ArrayList<TripItem> tripItems;
private JSONArray unclaimedTrips;
private TripSelectAdapter adapter;



public void getTrips() {

        JsonArrayRequest req = new JsonArrayRequest(url, new Response.Listener<JSONArray> () {  

        @Override
        public void onResponse(JSONArray response) {

            // Public Array
            unclaimedTrips = response;

            tripItems = new ArrayList<TripItem>();


            // Optional if you want to manipulate the data in some way
            if (unclaimedTrips != null) {

                for (int i = 0; i < unclaimedTrips.length(); i++) {

                    try {
                        JSONObject item = unclaimedTrips.getJSONObject(i);

                        int tripID = item.getInt("trip_id");
                        int claimID = item.getInt("claim_id");
                        String payrollCode = item.getString("payroll_code");
                        String tripDate = item.getString("trip_date");
                        String tripPurpose = item.getString("trip_purpose");

                        TripItem tripItem = new TripItem(tripID, claimID, payrollCode, tripDate, tripPurpose);

                        tripItems.add(tripItem);

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

                refreshData();
            }

        }


    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            unclaimedTrips = null;
            refreshData();

        }
    }) {

       @Override
       public Map<String, String> getHeaders() throws AuthFailureError {
           HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Accept", "application/json");
                headers.put("Content-Type", "application/json");
           return headers;
       };
    };


    // add the request object to the queue to be executed
    MyApplication.getInstance().addToRequestQueue(req);
}


public void refreshData() {

    if (tripItems.isEmpty()) {
        mEmptyList.setVisibility(android.view.View.VISIBLE);
    } else {
        mEmptyList.setVisibility(android.view.View.GONE);                   
    }

    adapter = new TripSelectAdapter(this, thisContext, tripItems);
    mTripList.setAdapter(adapter);
}
0 голосов
/ 15 апреля 2019

Ваша проблема в том, что вы пытаетесь вернуть то, что еще не было заполнено, вызов асинхронный, поэтому может потребоваться некоторое время, чтобы заполнить дату в вашем ArrayList<Cities>, поэтому она пуста.

Вы должны удалить эту строку return cities; и не забудьте создать final ArrayList<Cities> cities=new ArrayList<>(); вне вашего метода и удалить возврат ArrayList<Cities> в void.

И затем вы можете создать обратный вызов, чтобы уведомить, что данные заполнены в вашем ArrayList<Cities>, если вы пытаетесь заполнить их в RecyclerView, я рекомендую вам установить адаптер в методе onResponse().

Чтобы сделать ответный звонок, вы можете взглянуть на этот ответ или на этот Gist

...