Java 使用json对象在数组上迭代
这是来自我的php web服务的响应数组,它从mysql获取数据。 我想在android应用程序的列表视图中显示这些地址。 我该如何为此编写java代码。 这是接收结果的代码,但我无法得到任何结果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
[{"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);
}