Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用json对象在数组上迭代_Java_Android Studio - Fatal编程技术网

Java 使用json对象在数组上迭代

Java 使用json对象在数组上迭代,java,android-studio,Java,Android Studio,这是来自我的php web服务的响应数组,它从mysql获取数据。 我想在android应用程序的列表视图中显示这些地址。 我该如何为此编写java代码。 这是接收结果的代码,但我无法得到任何结果 [{"id":1,"flat_number":"b9","building_name":"ram society","locality":"kothrud",&q

这是来自我的php web服务的响应数组,它从mysql获取数据。 我想在android应用程序的列表视图中显示这些地址。 我该如何为此编写java代码。 这是接收结果的代码,但我无法得到任何结果

[{"id":1,"flat_number":"b9","building_name":"ram society","locality":"kothrud","city":"pune","state":"maharashtra","landmark":"near ACC school","pincode":411038,"type":"home"},
{"id":2,"flat_number":"b9","building_name":"ram society","locality":"kothrud","city":"pune","state":"maharashtra","landmark":"near ACC school","pincode":411038,"type":"work"}]
AddressActivity.java 这就是我显示从上面JSON获得的地址的地方

这部分代码是用onCreate方法编写的-

public class AddressHolder extends RecyclerView.ViewHolder {
    private final TextView tvFlatNumber, tvBuildingName, tvLocality, tvCity, tvState, tvLandmark, tvPincode, tvType;
    //any view you defined in item_single_item layout

    public AddressHolder(@NonNull View itemView) {
        super(itemView);
        tvFlatNumber = itemView.findViewById(R.id.flat_number);
        tvBuildingName = itemView.findViewById(R.id.building_name);
        tvLocality = itemView.findViewById(R.id.locality);
        tvCity = itemView.findViewById(R.id.city);
        tvState = itemView.findViewById(R.id.state);
        tvLandmark = itemView.findViewById(R.id.landmark);
        tvPincode = itemView.findViewById(R.id.pincode);
        tvType = itemView.findViewById(R.id.type);

    }

    public void bind(Address data) {
        tvFlatNumber.setText(data.flat_number);
        tvBuildingName.setText(data.building_name);
        tvLocality.setText(data.locality);
        tvCity.setText(data.city);
        tvState.setText(data.state);
        tvLandmark.setText(data.landmark);
        tvPincode.setText(data.pincode);
        tvType.setText(data.type);

    }
}
仍然没有显示任何内容,logcat中也没有显示任何错误。
帮助?

您可以创建由您获得的数据组成的类:

try{
JSONArray jsonArray = new JSONArray(response);

                            Address.fromJson(jsonArray);
}
catch(){}
在活动类中,您可以创建
List dataList=new ArrayList()
然后您可以用这些数据填充适配器。
我建议不要使用ListView,而是使用RecyclerView,因为它更易于维护,性能更好。
所以,在活动的布局中,而不是在ListView中添加

    public class YourDataClass {
    public String id;
        public String flat_number;
        public String building_name;
        public String locality;
        public String city;
        public String state;
        public String landmark;
        public String pincode;
        public String type;
    
        public YourDataClass(String id, String flat_number, String building_name, String locality, String city,
                             String state, String landmark, String pincode, String type) {
this.id = id
            this.flat_number = flut_number;
            this.building_name = building_number;
            this.locality = locality;
            this.city = city;
            this.state = state;
            this.landmark = landmark;
            this.pincode = pincode;
            this.type = type;
        }
    }
当您的数据列表准备就绪时,请执行以下操作:

recyclerView = findViewById(R.id.rv_list)
recyclerView.setLayoutManager(new LinearLayoutManager(this))
适配器代码:

recyclerView.setAdapter(new YourAdapter())
item_single_item的代码可以如下所示:

public class YourHolder extends RecyclerView.ViewHolder {
    private final TextView tvFlatNumber;
    private final TextView tvBuildingNumber;
    //any view you defined in item_single_item layout

    public YourHolder(@NonNull View itemView) {
        super(itemView);
        tvFlatNumber= itemView.findViewById(R.id.flat_number);
        tvBuildingNumber= itemView.findViewById(R.id.building_number);
       //and so on

    }

    public void bind(YourDataClass data) {
        tvFlatNumber.setText(data.flat_number)
//and so on
    }

编辑:

private void getAddress(){
StringRequest StringRequest=新StringRequest(
Request.Method.POST,
Constants.URL\u地址,
新建com.android.volley.Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
试一试{
JSONArray JSONArray=新JSONArray(响应);
ArrayList地址=address.fromJson(jsonArray);
AddressAdapter AddressAdapter=新的AddressAdapter(数据列表);
addressList.setAdapter(addressAdapter);
}捕获(JSONException e){
e、 printStackTrace();
}
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Toast.makeText(
getApplicationContext(),
“无法获取数据!”,
吐司,长度
).show();
}
}
);
RequestHandler.getInstance(this).addToRequestQueue(stringRequest);
}

您可以创建由您获得的数据组成的类:

try{
JSONArray jsonArray = new JSONArray(response);

                            Address.fromJson(jsonArray);
}
catch(){}
在活动类中,您可以创建
List dataList=new ArrayList()
然后您可以用这些数据填充适配器。
我建议不要使用ListView,而是使用RecyclerView,因为它更易于维护,性能更好。
所以,在活动的布局中,而不是在ListView中添加

    public class YourDataClass {
    public String id;
        public String flat_number;
        public String building_name;
        public String locality;
        public String city;
        public String state;
        public String landmark;
        public String pincode;
        public String type;
    
        public YourDataClass(String id, String flat_number, String building_name, String locality, String city,
                             String state, String landmark, String pincode, String type) {
this.id = id
            this.flat_number = flut_number;
            this.building_name = building_number;
            this.locality = locality;
            this.city = city;
            this.state = state;
            this.landmark = landmark;
            this.pincode = pincode;
            this.type = type;
        }
    }
当您的数据列表准备就绪时,请执行以下操作:

recyclerView = findViewById(R.id.rv_list)
recyclerView.setLayoutManager(new LinearLayoutManager(this))
适配器代码:

recyclerView.setAdapter(new YourAdapter())
item_single_item的代码可以如下所示:

public class YourHolder extends RecyclerView.ViewHolder {
    private final TextView tvFlatNumber;
    private final TextView tvBuildingNumber;
    //any view you defined in item_single_item layout

    public YourHolder(@NonNull View itemView) {
        super(itemView);
        tvFlatNumber= itemView.findViewById(R.id.flat_number);
        tvBuildingNumber= itemView.findViewById(R.id.building_number);
       //and so on

    }

    public void bind(YourDataClass data) {
        tvFlatNumber.setText(data.flat_number)
//and so on
    }

编辑:

private void getAddress(){
StringRequest StringRequest=新StringRequest(
Request.Method.POST,
Constants.URL\u地址,
新建com.android.volley.Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
试一试{
JSONArray JSONArray=新JSONArray(响应);
ArrayList地址=address.fromJson(jsonArray);
AddressAdapter AddressAdapter=新的AddressAdapter(数据列表);
addressList.setAdapter(addressAdapter);
}捕获(JSONException e){
e、 printStackTrace();
}
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Toast.makeText(
getApplicationContext(),
“无法获取数据!”,
吐司,长度
).show();
}
}
);
RequestHandler.getInstance(this).addToRequestQueue(stringRequest);
}

根据您的回答,我对问题做了一些更新。你能再检查一下吗?问题在这里-List dataList=new ArrayList();getAddress();在活动的onCreate调用中初始化List dataList。然后调用外部方法-getAddress()。然后将空数据列表传递给AddressAdapter。要解决这个问题,只需将List dataList=new ArrayList()更改为List dataList=getAddress();如果这没有帮助,那么在fromJson方法或Address类构造函数中解析JSONArray时就会出现问题。但我相信,在您阅读我之前的评论后,您会解决您的问题。按照您的要求更改了数据列表,当我记录它时,它显示为null,这意味着在fromJSON方法中解析时出现了一些错误。我现在该怎么办?根据你的回答,我对这个问题做了一些更新。你能再检查一下吗?问题在这里-List dataList=new ArrayList();getAddress();在活动的onCreate调用中初始化List dataList。然后调用外部方法-getAddress()。然后将空数据列表传递给AddressAdapter。要解决这个问题,只需将List dataList=new ArrayList()更改为List dataList=getAddress();如果这没有帮助,那么在fromJson方法或Address类构造函数中解析JSONArray时就会出现问题。但我相信,在您阅读我之前的评论后,您会解决您的问题。按照您的要求更改了数据列表,当我记录它时,它显示为null,这意味着在fromJSON方法中解析时出现了一些错误。我现在该怎么办?
public class YourHolder extends RecyclerView.ViewHolder {
    private final TextView tvFlatNumber;
    private final TextView tvBuildingNumber;
    //any view you defined in item_single_item layout

    public YourHolder(@NonNull View itemView) {
        super(itemView);
        tvFlatNumber= itemView.findViewById(R.id.flat_number);
        tvBuildingNumber= itemView.findViewById(R.id.building_number);
       //and so on

    }

    public void bind(YourDataClass data) {
        tvFlatNumber.setText(data.flat_number)
//and so on
    }
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/border_background"
    android:elevation="4dp"
    android:padding="8dp">

    <TextView
        android:id="@+id/flat_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/building_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/flat_number" />
</androidx.constraintlayout.widget.ConstraintLayout>
private void getAddress() {
        StringRequest stringRequest = new StringRequest(
                Request.Method.POST,
                Constants.URL_ADDRESS,
                new com.android.volley.Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        try {
                             JSONArray jsonArray = new JSONArray(response);
                             ArrayList<Address> address = Address.fromJson(jsonArray);
AddressAdapter addressAdapter = new AddressAdapter(dataList);
addressList.setAdapter(addressAdapter);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }

                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                        Toast.makeText(
                                getApplicationContext(),
                                "Data couldn't be fetched!",
                                Toast.LENGTH_LONG
                        ).show();
                    }
                }

        );

        RequestHandler.getInstance(this).addToRequestQueue(stringRequest);
    }