为了账号安全,请及时绑定邮箱和手机立即绑定

使用 volley 从方法返回 ArrayList

使用 volley 从方法返回 ArrayList

三国纷争 2022-10-07 16:21:18
我试图返回 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 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

如果您的响应返回一个带有城市元素数组的 JSONObject,那么您的请求是正确的,但如上所述,在调用回调之前,您不能期望实际得到结果。这是一个使用返回 JSONArray 的 JSONArrayRequest 的示例,但在您从 JSONObject 中提取 City 数组后,其工作方式与您的几乎相同。


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

}


查看完整回答
反对 回复 2022-10-07
?
皈依舞

TA贡献1851条经验 获得超3个赞

您的问题是您正在尝试返回尚未填充的内容,该调用是异步的,因此可能需要一些时间才能将日期填充到您的ArrayList<Cities>中,这就是它为空的原因。

您应该删除此行return cities;并记住在您的方法之外创建它final ArrayList<Cities> cities=new ArrayList<>();,并删除返回ArrayList<Cities>到 a void

然后,您可以创建一个回调来通知数据已填充到您ArrayList<Cities>的.RecyclerViewonResponse()

要进行回调,您可以查看此答案或此Gist


查看完整回答
反对 回复 2022-10-07
  • 2 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信