【问题标题】:how to catch the response array & then set on Listview? how to get response in array form & set on listview in Android?如何捕获响应数组然后在 Listview 上设置?如何以数组形式获得响应并在 Android 的 listview 上设置?
【发布时间】:2017-02-14 07:23:15
【问题描述】:

我已经发布了这个问题,但即使我再次编辑我的帖子也没有人提供解决方案,所以我删除并再次发布。

我不太了解 StringRequest 类的工作原理及其响应。请通过简单且适当的指南帮助我。它响应单个 Jsonobject 但不响应数组。 在这个 json 响应中,我不知道如何捕获该数组然后在 Listview 上设置的数据数组

服务器响应

I/System.out:
 {
 "success":true,"first_name":"savha","last_name":"jiii","mobile":2147483647
 }
 W/System.err: org.json.JSONException:
 Value
 {
 "success":true,"first_name":"savha","last_name":"jiii","mobile":2147483647
 }
 of type org.json.JSONObject cannot be converted to JSONArray

Json StringRequest Volley

php代码

< ?php

$con=mysqli_connect(XXXXXXXXXXXXXX);

$state=$_POST["state"];

$dist=$_POST["dist"];

$statement=mysqli_prepare($con,"SELECT first_name,last_name,mobile FROM first        WHERE state=? AND dist=?");

mysqli_stmt_bind_param($statement,"ss",$state,$dist);

mysqli_stmt_execute($statement);

mysqli_stmt_store_result($statement);

mysqli_stmt_bind_result($statement,$fname,$lname,$mobile);

$response=array();

$response["success"]=false;

while(mysqli_stmt_fetch($statement))

{

$response["success"]=true;

$response["first_name"]=$fname;

$response["last_name"]=$lname;

$response["mobile"]=$mobile;

}

echo json_encode($response);

?>

ServiceRequest 类

public class SevakRequest  extends StringRequest {

private static final String LOGIN_REQUEST_URL="http://XXXXXX.php";
private Map<String ,String> params;

public SevakRequest(String state,String dist, Response.Listener<String> listener)
{
    super(Method.POST,LOGIN_REQUEST_URL,listener,null);
    params=new HashMap<>();
   // params.put("service",service);
    params.put("state",state);
    params.put("dist",dist);
}

@Override
public Map<String, String> getParams() {
    return params;
}
}

MainActivity 类

public class SearchResult extends Activity {
Button btn1,btn2;
ListView lv1;
TextView tv1;
String serv, stat, dist;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_result);
    btn1 = (Button) findViewById(R.id.btn1);
    btn2 = (Button) findViewById(R.id.btn2);
    lv1 = (ListView) findViewById(R.id.lv1);
    tv1 = (TextView) findViewById(R.id.tv1);

    Intent in = getIntent();
    serv = in.getStringExtra("key1");
    stat = in.getStringExtra("key2");
    dist = in.getStringExtra("key3");
    tv1.setText(serv + " >> " + stat + " >> " + dist);

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

                if (success) {
                    JSONArray jsonArray = new JSONArray(response);
                    int length = jsonArray.length();
                    List<String> listContents = new ArrayList<String>(length);
                    for (int i = 0; i < length; i++) {
                        String fname = jsonResponse.getString("first_name").toString();
                        String lname = jsonResponse.getString("last_name").toString();
                        String mobile = jsonResponse.getString("mobile").toString();
                        listContents.add("First name: " + fname + "\nLast name: " + lname + "\nMobile: " + mobile);
                    }
                    lv1.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, listContents));

                } else {
                    Toast.makeText(getApplicationContext(), "Error occurred", Toast.LENGTH_LONG).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    };
    SevakRequest sevakRequest = new SevakRequest(stat, dist, listener);
    RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
    queue.add(sevakRequest);
}
}

【问题讨论】:

  • 发布您的服务器响应。
  • I/System.out: { "success":true,"first_name":"savha","last_name":"jiii","mobile":2147483647 } W/System.err: org.json.JSONException: Value { "success":true,"first_name":"savha","last_name":"jiii","mobile":2147483647 } of type org.json.JSONObject cannot be converted to JSONArray
  • 问题中添加了响应
  • 您在 json 响应中收到一个单一对象。解析的第一部分是正确的JSONObject jsonResponse = new JSONObject(response);,但在此之后您再次尝试将其放入数组中。它使您期待与您收到的不同的东西。如果我理解你的 php 代码是正确的,那么还有一个错误,你总是覆盖 $response 数组中的相同字段。
  • 它清楚地表明你的响应是 JSONObject 而不是 JSONArray

标签: php android json listview android-volley


【解决方案1】:

首先确保您的 json 数据是正确的。我猜你想要这个:

{
  "success": true,
  "data": [{
    "first_name": "savha",
    "last_name": "jiii",
    "mobile": 2147483647
  }, {
    "first_name": "john",
    "last_name": "smith",
    "mobile": 333123456
  }]
}

现在只返回一个静态 json 文件,这样您就可以专注于开发您的应用程序。 您可以更改您的 java 代码,如 JSONArray arr = jsonResponse.getJSONArray("data"); 以获取联系人 Objects 数组。

我个人更喜欢使用像 Gson 这样的库来更轻松地进行 json 编码/解码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2020-06-13
    相关资源
    最近更新 更多