2016-04-19 19 views
0

ユーザーの注文を表示するListViewを実行したいとします。下のコードでは、「成功」が得られましたが、オーダー配列が表示されません。JSONを使用したAndroid ListView Volleyでの構文解析

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

OrderAdapter:

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

私は、データベースから取得するために多くの方法を使用してきたが、すべてがうまくいきませんでした。

+0

として、あなたはJSONあなたのWebサービスの戻りを投稿することができますか?必要に応じて重要なコンテンツを削除します。 – Benoit

+0

アダプタコードも投稿してください –

+0

@Benoit My JSONはnullを返します。 $ response ["OrderList"] [] = $ row; 'はデータベーステーブルの合計行を表示しますが、すべてnullです。 –

答えて

0

JSONの形式が正しくありません。あなたはintentedとしてあなたのコードが動作するようにしたい場合は、あなたの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"));

+0

私は試してきましたが、私はそのフォーマットを得ていません。 –

+0

さて、あなたの質問は、Androidではなく、PHPでのJSONフォーマットについてです。問題は、あなたの応答を 'JSONArray'として解析しようとしていますが、キーを含む' JSONObject'です。そういうわけではありません。あなたは鍵を列挙することができますが、そうすることは非常に醜い方法でしょう... – Benoit

+0

私はあなたが言及した形式を持っています。しかし、結果はまだListViewに表示されません。 –

0

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

第2に、このエラーはわかりやすく、jsonをJSONObject型のJSONArrayとして解析しようとしています。 @Benoitは、あなたは、データベースからデータをフェッチするとき、あなたの応答を変更する、と彼はまた、ここで

が、あなたのデータベースの結果を解析する方法を説明しています質問ですが書いたように配列として値を取得する必要があります言ったように

JSON配列

How to build a JSON array from mysql database

関連する問題