2016-04-19 3 views
0

Я хочу сделать ListView, который показывает заказы пользователя. В приведенном ниже коде я получил «успех», но я не могу получить массив порядка.Android ListView с использованием JSON Анализ с помощью 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 вашей веб-сервиса возвращается? При необходимости удалите конфиденциальный контент. – 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

Хорошо, тогда ваш вопрос о форматировании JSON на PHP, а не в Android. Проблема заключается в том, что вы пытаетесь проанализировать свой ответ как '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(); 
    } 

Во-вторых, эту ошибку довольно просто понять, вы пытаетесь разобрать json как JSONArray, который имеет тип JSONObject.

Как @Benoit сказал, вы должны изменить свой ответ, когда вы запрашиваете данные из базы данных, и получить значения в массиве, как он писал

Вот вопрос, где он объяснил, как анализировать результаты базы данных а JSon массив

How to build a JSON array from mysql database

Смежные вопросы