Не могу добавить данные из json в ArrayList

Я пытаюсь отобразить данные из JSON в listView, но всякий раз, когда я пытаюсь добавить какое-то значение из json, мой список ничего не показывает.

Деятельность

public static final String LOG = hourlyWeather.class.getSimpleName();
    double test;
    RequestQueue mQuene;
    ArrayList<Weather> list;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hourly_weather);
        mQuene =  Volley.newRequestQueue(this);

        list = new ArrayList<Weather>();
        test();

        hourlyWeatherAdapter adapter = new hourlyWeatherAdapter(this, list);

        ListView listView = (ListView) findViewById(R.id.weatherListView);

        listView.setAdapter(adapter);
    }
    public void test() {
        String url = "https://api.openweathermap.org/data/2.5/weather?lat=50.7578594&lon=16.2127653&units=metric&appid=ID";
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                response -> {
                    try {
                        JSONObject object = response.getJSONObject("main");
                        for (int i = 0; i<object.length(); i++){
                            test = object.getDouble("temp");
                        }
                        Log.i(LOG,String.valueOf(test));
                        list.add(new Weather(test));

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }, Throwable::printStackTrace);
        mQuene.add(request);
    }
}

Адаптер

public class hourlyWeatherAdapter extends ArrayAdapter<Weather> {

public hourlyWeatherAdapter(@NonNull Context context, ArrayList<Weather> list) {
    super(context, 0, list);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

    View view = convertView;
    if (view == null) {
        view = LayoutInflater.from(getContext()).inflate(R.layout.weather_list_item, parent, false);
    }
    Weather model = getItem(position);

    TextView temperature = (TextView) view.findViewById(R.id.hourly_time);
    temperature.append(String.valueOf(model.getTemp()));

    return view;
 } 
}

public class Weather {

private double temp;

public Weather(double temp) {
    this.temp = temp;
}

public double getTemp() {
    return temp;
 }
}

Когда я буду использовать Log.i, я ясно увижу значение json в своем логарифме. Где можно вопрос? Я попытался добавить некоторые фиктивные данные, и это работает просто отлично.

Вы уже используете Log для печати и проверки, действительно ли получены ваши данные?

Augusto 30.05.2019 19:20

Да, вот значение: I/hourlyWeather: 16,77

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

Ответы 1

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

Вы должны объявить hourlyWeatherAdapter adapter = new hourlyWeatherAdapter(this, list); вне вашего метода onCreate(), а после изменения массива вы должны вызвать notifyDataSetChanged();. Кроме того, вы должны инициализировать свой список и адаптер перед вызовом test().

public static final String LOG = hourlyWeather.class.getSimpleName();
    double test;
    RequestQueue mQuene;
    ArrayList<Weather> list;
    hourlyWeatherAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hourly_weather);
        mQuene =  Volley.newRequestQueue(this);

        list = new ArrayList<Weather>();
        adapter = new hourlyWeatherAdapter(this, list);

        ListView listView = (ListView) findViewById(R.id.weatherListView);
        listView.setAdapter(adapter);

        test();
    }

    public void test() {
        String url = "https://api.openweathermap.org/data/2.5/weather?lat=50.7578594&lon=16.2127653&units=metric&appid=ID";
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
            response -> {
                try {
                    JSONObject object = response.getJSONObject("main");
                    for (int i = 0; i<object.length(); i++){
                        test = object.getDouble("temp");
                    }
                    Log.i(LOG,String.valueOf(test));
                    list.add(new Weather(test));

                    // Update list
                    adapter.notifyDataSetChanged();

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }, Throwable::printStackTrace);
       mQuene.add(request);
    }
}

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