【问题标题】:Volley not sending the params while using JsonArrayRequest使用 JsonArrayRequest 时 Volley 未发送参数
【发布时间】:2017-03-10 15:40:57
【问题描述】:

Android 代码在使用 JsonArrayRequest 时没有发送参数。

如果我使用 StringRequest 而不是 JsonArrayRequest,如何将响应从 String 转换为 JSONObject 以在 RecyclerView 中显示?

Intent intent = getIntent();
final String userID = intent.getExtras().getString("userID");
recyclerView = (RecyclerView)findViewById(R.id.display_expenses_recycler_view_id);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.POST, expensesDisplay_url, (String) null,
        new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                int count = 0;
                Log.i("Response", String.valueOf(response));
                while (count < response.length()) {
                    try {
                        JSONObject jsonObject = response.getJSONObject(count);
                        ExpensesDetails expensesDetails = new ExpensesDetails(jsonObject.getString("Expenses"),
                                jsonObject.getString("Description"), jsonObject.getString("datetime"));
                        arrayList.add(expensesDetails);
                        count++;
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(DisplayExpenses.this, "Error", Toast.LENGTH_LONG).show();
                error.printStackTrace();
            }
        }) {
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        Map<String, String> params = new HashMap<String, String>();
        params.put("userID", userID);
        return params;
    }

};
Log.i("Array", String.valueOf(arrayList));
MySingleton.getMyInstance(DisplayExpenses.this).addToRequestQueue(jsonArrayRequest);
adapter = new RecyclerAdapterExpenses(arrayList);
recyclerView.setAdapter(adapter);View.setAdapter(adapter);

这是服务器发送的结果:

[
  {
    "Expenses":"0",
    "Description":"car",
    "datetime":"2016-10-25 21:10:57"
  },
  {
    "Expenses":"2000",
    "Description":"Car",
    "datetime":"2016-10-25 21:46:05"
  },
  {
    "Expenses":"5000",
    "Description":"House payment",
    "datetime":"2016-10-25 21:47:11"
  },
  {
    "Expenses":"200",
    "Description":"",
    "datetime":"2016-10-26 20:51:42"
  },
  {
    "Expenses":"500",
    "Description":"",
    "datetime":"2016-10-26 23:55:21"
  }
]

【问题讨论】:

  • 查看(String) null 的文档。 是你要发布的数据
  • JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.POST, costsDisplay_url, userID, new Response.Listener() { 像这样 ??
  • 我不太确定字符串是那个参数。根据这篇文章,它是JSONObjectstackoverflow.com/questions/18048806/…
  • 如果我选择使用 StringRequest 我将如何将字符串响应转换为 JSONArray 以在回收站视图中显示它??
  • 我不确定你为什么要这样做,但我刚刚在下面更新了我的答案

标签: android arrays android-volley


【解决方案1】:

您确定没有提供用户 ID 吗?在 Volley 请求完成之前,您有一个空的 RecyclerView。而您的 Log.i 语句发生在 Volley 完成之前,因此您会看到一个空列表...

while 循环之后,您需要在onResponse 调用中使用adapter.notifyDataSetChanged() 来告诉适配器显示您添加的数据。

不太确定View 在这里...但您可能不需要在两个视图上使用相同的适配器。

recyclerView.setAdapter(adapter);View.setAdapter(adapter);

如果我尝试使用 StringRequest 而不是 JsonArrayRequest 我将如何将字符串响应从 String 转换为 JSONObject 以在 RecyclerView 中显示它们

您有一个来自onResponseString response,因此请使用带有StringJSONArray 的构造函数。

JSONArray array = new JSONArray(response);

注意:这需要 try-catch。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多