使用 volley 从方法返回 ArrayList

我试图返回 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;

}


三国纷争
浏览 115回答 2
2回答

摇曳的蔷薇

如果您的响应返回一个带有城市元素数组的 JSONObject,那么您的请求是正确的,但如上所述,在调用回调之前,您不能期望实际得到结果。这是一个使用返回 JSONArray 的 JSONArrayRequest 的示例,但在您从 JSONObject 中提取 City 数组后,其工作方式与您的几乎相同。&nbsp; &nbsp; private ListView mTripList;public ArrayList<TripItem> tripItems;private JSONArray unclaimedTrips;private TripSelectAdapter adapter;public void getTrips() {&nbsp; &nbsp; &nbsp; &nbsp; JsonArrayRequest req = new JsonArrayRequest(url, new Response.Listener<JSONArray> () {&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void onResponse(JSONArray response) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Public Array&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unclaimedTrips = response;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tripItems = new ArrayList<TripItem>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Optional if you want to manipulate the data in some way&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (unclaimedTrips != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < unclaimedTrips.length(); i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; JSONObject item = unclaimedTrips.getJSONObject(i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int tripID = item.getInt("trip_id");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int claimID = item.getInt("claim_id");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String payrollCode = item.getString("payroll_code");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String tripDate = item.getString("trip_date");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String tripPurpose = item.getString("trip_purpose");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TripItem tripItem = new TripItem(tripID, claimID, payrollCode, tripDate, tripPurpose);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tripItems.add(tripItem);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (JSONException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; refreshData();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }, new Response.ErrorListener() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void onErrorResponse(VolleyError error) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unclaimedTrips = null;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; refreshData();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }) {&nbsp; &nbsp; &nbsp; &nbsp;@Override&nbsp; &nbsp; &nbsp; &nbsp;public Map<String, String> getHeaders() throws AuthFailureError {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HashMap<String, String> headers = new HashMap<String, String>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headers.put("Accept", "application/json");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headers.put("Content-Type", "application/json");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return headers;&nbsp; &nbsp; &nbsp; &nbsp;};&nbsp; &nbsp; };&nbsp; &nbsp; // add the request object to the queue to be executed&nbsp; &nbsp; MyApplication.getInstance().addToRequestQueue(req);}public void refreshData() {&nbsp; &nbsp; if (tripItems.isEmpty()) {&nbsp; &nbsp; &nbsp; &nbsp; mEmptyList.setVisibility(android.view.View.VISIBLE);&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; mEmptyList.setVisibility(android.view.View.GONE);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; }&nbsp; &nbsp; adapter = new TripSelectAdapter(this, thisContext, tripItems);&nbsp; &nbsp; mTripList.setAdapter(adapter);}

皈依舞

您的问题是您正在尝试返回尚未填充的内容,该调用是异步的,因此可能需要一些时间才能将日期填充到您的ArrayList<Cities>中,这就是它为空的原因。您应该删除此行return cities;并记住在您的方法之外创建它final ArrayList<Cities> cities=new ArrayList<>();,并删除返回ArrayList<Cities>到 a&nbsp;void。然后,您可以创建一个回调来通知数据已填充到您ArrayList<Cities>的.RecyclerViewonResponse()要进行回调,您可以查看此答案或此Gist
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java