【问题标题】:Android ListView using JSON Parsing with VolleyAndroid ListView 使用 JSON 解析和 Volley
【发布时间】:2016-04-19 11:37:55
【问题描述】:

我想做一个显示用户订单的 ListView。在下面的代码中,我得到了“成功”的作品,但我无法让订单数组出现。

public void getOrderList() {
    SharedPreferences sharedPreferences = getSharedPreferences("UserData", Context.MODE_PRIVATE);
    final String hpno = sharedPreferences.getString("hpno", DEFAULT);
    final OrderAdapter orderAdapter = new OrderAdapter(this, R.layout.row_layout);
    orderIdListView.setAdapter(orderAdapter);

    Response.Listener<String> responseListener = new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            try {
                JSONObject jsonResponse = new JSONObject(response);
                boolean success = jsonResponse.getBoolean("success");

                if (success) {
                    JSONArray orderList = new JSONArray(response);
                    for (int i = 0; i < orderList.length(); i++) {
                        HashMap<String, String> map = new HashMap<String, String>();
                        JSONObject object = orderList.getJSONObject(i);
                        map.put("order_id", "Order Number: " + object.getString("order_id"));
                        orderAdapter.add(map);
                    }
                } else {
                    AlertDialog.Builder builder = new AlertDialog.Builder(ViewOrderActivity.this);
                    builder.setMessage("Order(s) Failed to be retrieved")
                            .setNegativeButton("Retry", null)
                            .create()
                            .show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    };

    ViewOrderRequest viewOrderRequest = new ViewOrderRequest(hpno, responseListener);
    RequestQueue queue = Volley.newRequestQueue(ViewOrderActivity.this);
    queue.add(viewOrderRequest);
}

订单适配器:

public class OrderAdapter extends ArrayAdapter {
    List list = new ArrayList();
    public OrderAdapter(Context context, int resource) {
        super(context, resource);
    }

    public void add(Order order) {
        list.add(order);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
         return list.add(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row;
        row = convertView;
        OrderHolder orderHolder;
        if (row == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = layoutInflater.inflate(R.layout.row_layout, parent, false);
            orderHolder = new OrderHolder();
            orderHolder.orderIdText = (TextView) row.findViewById(R.id.orderIdText);
            row.setTag(orderHolder);
        } else {
            orderHolder = (OrderHolder) row.getTag();
        }
        Order order = (Order) this.getItem(position);
        orderHolder.orderIdText.setText(order.getOrder_id());
        return row;
    }

    static class OrderHolder {
        TextView orderIdText;
    }
}

我的 PHP 代码:

<?php
    require "init.php";

    $hpno = $_POST['hpno'];

    $statement = mysqli_prepare($con, "SELECT * FROM `Order` WHERE hpno = ?") or die(mysqli_error($con));
    mysqli_stmt_bind_param($statement, "s", $hpno);
    mysqli_stmt_execute($statement);

    mysqli_stmt_store_result($statement);
    mysqli_stmt_bind_result($statement, $order_id, $total_price, $quantity, $payment_status, $hpno, $menu_id, $ordered_on);

    $response = array();
    $response["success"] = false;  

    while(mysqli_stmt_fetch($statement)){
        $response["success"] = true;
        array_push($response, array("order_id"=>$order_id, "total_price"=>$total_price, "quantity"=>$quantity));
    }

    echo json_encode($response);
?>

JSON 返回:

{
    "success": true,
    "0": {
        "order_id": 21,
        "total_price": 6,
        "quantity": 1
    },
    "1": {
        "order_id": 22,
        "total_price": 18,
        "quantity": 3
    },
    "2": {
        "order_id": 23,
        "total_price": 25,
        "quantity": 5
    },
    "3": {
        "order_id": 24,
        "total_price": 35,
        "quantity": 5
    }
}

LOGCAT:

04-19 22:43:17.280 15452-15452/wqyap762.rprqs W/System.err: org.json.JSONException: Value {"success":true,"0":{"order_id":21,"total_price":6,"quantity":1},"1":{"order_id":22,"total_price":18,"quantity":3},"2":{"order_id":23,"total_price":25,"quantity":5},"3":{"order_id":24,"total_price":35,"quantity":5}} of type org.json.JSONObject cannot be converted to JSONArray

错误来自这一行:

JSONArray orderList = new JSONArray(response);

我一直在使用许多方法从数据库中检索,但都不起作用。

【问题讨论】:

  • 您可以发布您的网络服务返回的 JSON 吗?如果需要,删除敏感内容。
  • 请同时发布您的适配器代码
  • @Benoit 我的 JSON 返回 null。 $response["OrderList"][] = $row; 确实显示了数据库表中的总行,但都是空的。
  • 请发布您收到的确切 JSON,以便我们查看您的问题在哪里。
  • @Benoit 抱歉让您久等了。我刚刚发布了。

标签: php android arrays json listview


【解决方案1】:

您的 JSON 格式不正确。如果您希望您的代码按预期工作,您的 JSON 应该是:

{
    "success": true,
    "values": [ {
        "order_id": 21,
        "total_price": 6,
        "quantity": 1
    },
    {
        "order_id": 22,
        "total_price": 18,
        "quantity": 3
    },
    {
        "order_id": 23,
        "total_price": 25,
        "quantity": 5
    },
    {
        "order_id": 24,
        "total_price": 35,
        "quantity": 5
    }]
}

你的代码类似于:

JSONArray orderList = new JSONArray(response.getJSONArray("values"));

【讨论】:

  • 那么您的问题是关于 PHP 中的 JSON 格式,而不是 Android。您遇到的问题是您试图将您的响应解析为JSONArray,但它是一个包含密钥的JSONObject。所以它不是那样工作的。您可以枚举键,但这将是一种非常丑陋的方式......
  • 我得到了你提到的格式。但结果仍然没有显示在 ListView 中。
【解决方案2】:

首先,您需要通知适配器的更改

if (success) {
       JSONArray orderList = new JSONArray(response);
       for (int i = 0; i < orderList.length(); i++) {
             HashMap<String, String> map = new HashMap<String, String>();
             JSONObject object = orderList.getJSONObject(i);
             map.put("order_id", "Order Number: " + object.getString("order_id"));
             orderAdapter.add(map);
        }
        oderAdapter.notifyDataSetChanged();
    }

其次,该错误很容易理解,您正在尝试将 json 解析为 JSONObject 类型的 JSONArray。

正如@Benoit 所说,您应该在从数据库中获取数据时更改您的响应,并将值作为数组获取,就像他也写的那样

这是一个问题,解释了如何将数据库结果解析为 json 数组

How to build a JSON array from mysql database

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-04
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多