Перебор массива с объектами json

[{"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 не отображается ошибка. помощь..?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать класс, состоящий из полученных вами данных:

    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);
    }

я сделал некоторые обновления вопроса в соответствии с вашим ответом. Вы можете проверить еще раз?

Mr_Sharma 22.12.2020 09:12

проблема здесь - List<Address> dataList = new ArrayList<>(); получить адрес();

Alex Rmcf 22.12.2020 11:36

Вы инициализируете List<Address> dataList внутри вызова onCreate вашей Activity. А затем вызовите внешний метод — getAdress(). После этого вы передаете пустой список данных в свой AddressAdapter. Чтобы решить эту проблему, просто измените List<Address> dataList = new ArrayList<>() на List<Address> dataList = getAddress();

Alex Rmcf 22.12.2020 11:39

Если это не поможет, у вас возникла проблема при анализе JSONArray в методе fromJson или в конструкторе класса Address. но я уверен, что вы решите свою проблему после того, как прочитаете мой предыдущий комментарий

Alex Rmcf 22.12.2020 11:43

изменил список данных, как вы просили, и когда я регистрирую его, он показывает ноль, что означает некоторую ошибку при анализе метода fromJSON. Что мне теперь делать?

Mr_Sharma 22.12.2020 13:51

Вы можете отлаживать свой код? Я предлагаю вам поставить точку остановки внутри тела try {} в первой строке конструктора public Address (объект JSONObject). Является ли этот объект объектом JSON? Есть ли у него правильные ключи? и так далее

Alex Rmcf 22.12.2020 14:06

Кстати, подскажите, что внутри вашего метода getAdress, который вы вызываете в onCreate? Если это тот, который вы разместили в верхней части своего вопроса, я предполагаю, что он асинхронный, поэтому вы предполагаете установить адаптер в методе onResponse.

Alex Rmcf 22.12.2020 14:08

Посмотрите раздел EDIT моего ответа

Alex Rmcf 22.12.2020 14:16

Другие вопросы по теме