[{"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"}]
это массив ответов от моего веб-сервиса php, который извлекает данные из mysql. я хочу отобразить эти адреса в виде списка в приложении для Android. как мне написать код Java для этого. это код для получения результата, но я не могу получить никакого результата.
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 {
JSONObject obj = new JSONObject(response);
flat_number = obj.getString("flat_number");
building_name = obj.getString("building_name");
locality = obj.getString("locality");
city = obj.getString("city");
state = obj.getString("state");
landmark = obj.getString("landmark");
pincode = obj.getInt("pincode");
type = obj.getString("type");
} 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);
}
Пожалуйста, помогите с кодом Java для просмотра списка. и как сопоставить эти данные с адаптером??
после первого ответа вот что я сделал код Адрес.java
public class Address {
public String flat_number;
public String building_name;
public String locality;
public String city;
public String state;
public String landmark;
public int pincode;
public String type;
// Constructor to convert JSON object into a Java class instance
public Address(JSONObject object){
try {
this.flat_number = object.getString("flat_number");
this.building_name = object.getString("building_name");
this.locality = object.getString("locality");
this.city = object.getString("city");
this.state = object.getString("state");
this.landmark = object.getString("landmark");
this.pincode = object.getInt("pincode");
this.type = object.getString("type");
} catch (JSONException e) {
e.printStackTrace();
}
}
// Factory method to convert an array of JSON objects into a list of objects
// User.fromJson(jsonArray);
public static ArrayList<Address> fromJson(JSONArray jsonObjects) {
ArrayList<Address> address = new ArrayList<Address>();
for (int i = 0; i < jsonObjects.length(); i++) {
try {
address.add(new Address(jsonObjects.getJSONObject(i)));
} catch (JSONException e) {
e.printStackTrace();
}
}
return address;
}
}
AddressAdapter.java
public class AddressAdapter extends RecyclerView.Adapter<AddressHolder>{
private List<Address> dataList;
public AddressAdapter(List<Address> list){
this.dataList= list;
}
@NonNull
@Override
public AddressHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.row, parent, false);
return new AddressHolder(view);
}
@Override
public void onBindViewHolder(@NonNull AddressHolder holder, int position) {
holder.bind(dataList.get(position));
}
@Override
public int getItemCount() {
return dataList.size();
}
}
Адресхолдер.java
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);
}
}
AddressActivity.java здесь я показываю адрес, который я получил сверху JSON
эта часть кода написана в методе onCreate-
RecyclerView addressList;
String flat_number, building_name, locality, city, state, landmark, type;
int pincode;
addressList = findViewById(R.id.addressList);
addressList.setLayoutManager(new LinearLayoutManager(this));
List<Address> dataList = new ArrayList<>();
getAddress();
// Construct the data source
ArrayList<Address> address = new ArrayList<Address>();
// Create the adapter to convert the array to views
AddressAdapter addressAdapter = new AddressAdapter(dataList);
// Attach the adapter to a ListView
addressList.setAdapter(addressAdapter);
//on create ends
и в методе getAddress()-
try{
JSONArray jsonArray = new JSONArray(response);
Address.fromJson(jsonArray);
}
catch(){}
по-прежнему ничего не отображается, и в logcat не отображается ошибка. помощь..?
Вы можете создать класс, состоящий из полученных вами данных:
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;
}
}
На занятии вы делаете List<YourDataClass> dataList = new ArrayList()<>;
Затем вы можете заполнить адаптер этими данными.
Я предлагаю использовать не ListView, а RecyclerView, потому что он проще в обслуживании и имеет лучшую производительность.
Итак, в макете вашей деятельности вместо ListView добавьте
<androidx.recyclerview.widget.RecyclerView
android:id = "@+id/rv_list"
android:layout_width = "match_parent"
android:layout_height = "wrap_content" />
Затем в действии сделайте это в onCreate:
recyclerView = findViewById(R.id.rv_list)
recyclerView.setLayoutManager(new LinearLayoutManager(this))
Когда ваш список данных будет готов, сделайте следующее:
recyclerView.setAdapter(new YourAdapter())
Код адаптера:
public class YourAdapter extends RecyclerView.Adapter<YourHolder>{
private List<YourDataClass> dataList;
public YourAdapter(List<YourDataClass> list){
this.dataList= list;
}
@NonNull
@Override
public YourHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.item_single_item, parent, false);
return new YourHolder(view);
}
@Override
public void onBindViewHolder(@NonNull YourHolder holder, int position) {
holder.bind(dataList.get(position));
}
@Override
public int getItemCount() {
return dataList.size();
}
}
R.layout.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
}
Код item_single_item может быть примерно таким:
<?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);
}
проблема здесь - List<Address> dataList = new ArrayList<>(); получить адрес();
Вы инициализируете List<Address> dataList внутри вызова onCreate вашей Activity. А затем вызовите внешний метод — getAdress(). После этого вы передаете пустой список данных в свой AddressAdapter. Чтобы решить эту проблему, просто измените List<Address> dataList = new ArrayList<>() на List<Address> dataList = getAddress();
Если это не поможет, у вас возникла проблема при анализе JSONArray в методе fromJson или в конструкторе класса Address. но я уверен, что вы решите свою проблему после того, как прочитаете мой предыдущий комментарий
изменил список данных, как вы просили, и когда я регистрирую его, он показывает ноль, что означает некоторую ошибку при анализе метода fromJSON. Что мне теперь делать?
Вы можете отлаживать свой код? Я предлагаю вам поставить точку остановки внутри тела try {} в первой строке конструктора public Address (объект JSONObject). Является ли этот объект объектом JSON? Есть ли у него правильные ключи? и так далее
Кстати, подскажите, что внутри вашего метода getAdress, который вы вызываете в onCreate? Если это тот, который вы разместили в верхней части своего вопроса, я предполагаю, что он асинхронный, поэтому вы предполагаете установить адаптер в методе onResponse.
Посмотрите раздел EDIT моего ответа
я сделал некоторые обновления вопроса в соответствии с вашим ответом. Вы можете проверить еще раз?