Arraylist ничего не отображает

Я хочу знать, почему мой Arraylist ничего не отображает:

{"Friends":[{"name":"Java","age":"18"},{"name":"Python","age":"35"},{"name":"Denis","age":"45"}]}

MainActivity (появляется тост в catch of OnPostExecute под названием «CATCH OF THE TRY»):

package com.example.parsingjson;

import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

    private ListView lv;
    String Friends;
    String namey, age;
    private static String JSON_URL="https://run.mocky.io/v3/9c0d17c6-c9a4-41d9-89cc-ac43e44f2b88";
    ArrayList<HashMap<String,String>> friendsList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        friendsList = new ArrayList<>();
        lv = findViewById(R.id.listview);
        GetData getData = new GetData();
        getData.execute();
    }

    public class GetData extends AsyncTask<String, String, String>{

        @Override
        protected String doInBackground(String... strings) {
            String current = "";

            try {
                URL url;
                HttpURLConnection urlConnection = null;

                try {
                    url = new URL(JSON_URL);
                    urlConnection = (HttpURLConnection) url.openConnection();
                    InputStream in = urlConnection.getInputStream();
                    InputStreamReader isr = new InputStreamReader(in);
                    int data = isr.read();
                    while (data != -1) {
                        current += (char) data;
                        data = isr.read();
                    }

                    return current;
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (urlConnection != null) {
                        urlConnection.disconnect();
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
             return current;
            }

        @Override
        protected void onPostExecute(String s) {
//            Toast.makeText(getApplicationContext(), "POST EXECUTE", Toast.LENGTH_LONG).show();
            try{
 //               Toast.makeText(getApplicationContext(), "TRY", Toast.LENGTH_LONG).show();

                JSONObject jsonObject = new JSONObject(s);
                JSONArray jsonArray = jsonObject.getJSONArray(Friends);
                for (int i = 0; i< jsonArray.length() ; i++){

                    Toast.makeText(getApplicationContext(), "FOR", Toast.LENGTH_LONG).show();
                    JSONObject jsonObject1 = jsonArray.getJSONObject(i);

                namey = jsonObject1.getString("name");
                age = jsonObject1.getString("age");
                //HashMap
                    HashMap<String, String> friends = new HashMap<>();

                    friends.put("name","namey");
                    friends.put("age","age");
                    friendsList.add(friends);
//                    Toast.makeText(getApplicationContext(), "OPERATION SUCCESSFUL", Toast.LENGTH_LONG).show();
                }
 //                   Toast.makeText(getApplicationContext(), "APRES FOR", Toast.LENGTH_LONG).show();

        } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(), "CATCH OF THE TRY", Toast.LENGTH_LONG).show();
            }
            // Displaying the results
            ListAdapter adapter = new SimpleAdapter(
                    MainActivity.this,
                    friendsList,
                    R.layout.row_layout,
                    new String[]{"name", "age"},
                    new int []{R.id.textView, R.id.textView2});

            lv.setAdapter(adapter);
        }
    }
}

row_layout.xml:

<?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">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:fontFamily="sans-serif-black"
        android:text="TextView"
        android:textColor="#000000"
        android:textSize="36sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="24dp"
        android:text="TextView"
        android:textSize="30sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>

Activity_Main.xml:

<?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="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listview"
        android:layout_width="409dp"
        android:layout_height="729dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Единственный тост, который я не могу показать, находится в for (int i = .... Отображается тост в catch.

 org.json.JSONException: No value for null
     at org.json.JSONObject.get(JSONObject.java:399)
     at org.json.JSONObject.getJSONArray(JSONObject.java:594)
     at com.example.parsingjson.MainActivity$GetData.onPostExecute(MainActivity.java:107)
     at com.example.parsingjson.MainActivity$GetData.onPostExecute(MainActivity.java:52)
     at android.os.AsyncTask.finish(AsyncTask.java:755)
     at android.os.AsyncTask.access$900(AsyncTask.java:192)
     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
     at android.os.Handler.dispatchMessage(Handler.java:107)
     at android.os.Looper.loop(Looper.java:214)
     at android.app.ActivityThread.main(ActivityThread.java:7356)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

не могли бы вы уточнить, с какой именно проблемой вы столкнулись ?? хорошо, я хотел знать, что ваш вызов API успешен или нет, а также ответ хранится в вашей модели или нет ??

Tanishq Chawda 20.11.2022 20:00

Если этот блок catch работает, это означает, что что-то пошло не так в try, где вы анализируете JSON. Посмотрите на трассировку стека для JSONException в ваших журналах, она скажет вам, в чем проблема. (Добавьте его к своему ответу, если вам нужна помощь в его решении)

cactustictacs 20.11.2022 21:07

@cactustictacs я добавил строку logcat

Chazzy 20.11.2022 22:57

@Tanishq Chawda Проблема в том, что в списке ничего не отображается. Я добавляю Toast в Catch of doInBackGroud, и Toast не появляется.

Chazzy 20.11.2022 23:15

Это не трассировка стека для вашего JSONException, это просто случайное ведение журнала. Запустите свое приложение, сделайте всплывающее всплывающее окно «поймать», затем перейдите к logcat (возможно, отфильтруйте по уровню журнала ошибок) и найдите трассировку стека. Проверьте метку времени, если вам нужно. Вам нужны строки, которые говорят JSONException и Caused by и т. д., и все такое. Просто отредактируйте свой вопрос, не публикуйте ответы!

cactustictacs 20.11.2022 23:15

@cactustictacs Я нашел эти строки и добавил в РЕДАКТИРОВАТЬ

Chazzy 21.11.2022 00:12

@Chazzy Не включайте ответ на вопрос, пожалуйста (вместо этого опубликуйте как отдельный ответ).

user4157124 21.11.2022 12:42
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Как включить TLS в gRPC-клиенте и сервере : 2
Как включить TLS в gRPC-клиенте и сервере : 2
Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
Принципы SOLID - лучшие практики
Принципы SOLID - лучшие практики
SOLID - это аббревиатура, обозначающая пять ключевых принципов проектирования: принцип единой ответственности, принцип "открыто-закрыто", принцип...
gRPC на Android с использованием TLS
gRPC на Android с использованием TLS
gRPC - это относительно новая концепция взаимодействия между клиентом и сервером, но не более.
0
7
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот бит в вашей трассировке стека, который говорит, где что-то идет не так:

org.json.JSONException: No value for null
     at org.json.JSONObject.get(JSONObject.java:399)
     at org.json.JSONObject.getJSONArray(JSONObject.java:594)
     at com.example.parsingjson.MainActivity$GetData.onPostExecute(MainActivity.java:107)

Итак, в строке 107 в MainActivity в вашей функции onPostExecute вы вызываете getJSONArray(). Исключением является отсутствие значения для null, что означает, что вы передаете null этому вызову.

Я не знаю, какая именно строка 107, но я предполагаю, что это так:

JSONArray jsonArray = jsonObject.getJSONArray(Friends);

и если вы передаете туда null, то Friends должно быть null. И из кода, который вы разместили, это правда - вы создаете переменную

// no value assigned - null by default
String Friends;

но тогда вы на самом деле нигде не назначаете String. Я предполагаю, что вы хотели назначить ему ключ JSON

String Friends = "Friends";

Также имя переменной действительно должно быть friends — только классы и интерфейсы должны начинаться с заглавной буквы. Просто облегчает рассказ о том, что происходит!

@ cactustictacs Благодаря вашему ответу я обнаружил, что забыл поставить имя Друг между "". Теперь новая проблема заключается в том, что я показываю 3 раза NAMEY и AGE вместо Java 18, Python 35 и Denis 45. У вас есть идеи?

Chazzy 21.11.2022 01:00

@Chazzy, вы добавляете строку "namey" на свою карту вместо ссылки на переменную namey

cactustictacs 21.11.2022 01:17

Вы правы, я написал Friends вместо "Friend" и "namey", "age" вместо namey и age. Большое спасибо

Chazzy 21.11.2022 15:52

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