从公共静态列表<>中检索其他数据

时间:2017-11-23 19:19:03

标签: android arraylist

我正在尝试在Android Studios中开发自己的天气应用程序。到目前为止,我的应用程序成功连接到API并解析收到的json数据。然后,它使用ListView和getView方法显示7天预测,方法是将每一天及其预测内容显示在单独的行中。

我还试图在TextView中显示预测数据的位置。因此,在我的活动的顶部,它会说“伦敦”,然后是一行X行的ListView,具体取决于它显示的预测天数。

我的JSONParser类返回一个ArrayList,其中包含每天的数据。我使用forloop循环遍历JSON数组以检索预测的每一天。

我面临的一个小问题是我目前正在从forloop中的API(EG“London”)中检索位置字符串,这是没有必要的,因为我只需要检索一次该值,而不是X的数量根据数组长度的时间。

JSONParser类:

    public class JSONParser {


public static List<ForecastModel> getForecast(String data) {
    List<ForecastModel> forecastModelList = new ArrayList<>();
    DateFormat dateFormat = DateFormat.getDateInstance();

    try {
        JSONObject mainObject = new JSONObject(data);
        JSONArray jsonArray = mainObject.getJSONArray("data");
        ForecastModel location = new ForecastModel();
        //set city name
        location.setCityName(mainObject.getString("city_name"));
        forecastModelList.add(location);

        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject forecastObject = jsonArray.getJSONObject(i);
            ForecastModel forecastModel = new ForecastModel();
            forecastModel.setTimeStamp(forecastObject.getString("ts"));

            //get city name
            forecastModel.setCityName(mainObject.getString("city_name"));

            //Format UNIX time stamp
            Date forecastDate = new Date((forecastObject.getLong("ts") * 1000L));
            String formattedDate = dateFormat.format(forecastDate);
            forecastModel.setTimeStamp(formattedDate);

            forecastModel.setTemp(forecastObject.getDouble("temp"));
            forecastModel.setMaxTemp(forecastObject.getDouble("max_temp"));
            forecastModel.setMinTemp(forecastObject.getDouble("min_temp"));
            forecastModel.setWindSpeed(forecastObject.getDouble("wind_spd"));

            JSONObject weatherObj = forecastObject.getJSONObject("weather");
            forecastModel.setCondition(weatherObj.getString("description"));

            forecastModelList.add(forecastModel);

        }


    } catch (JSONException e) {
        e.printStackTrace();
    }

    return forecastModelList;
}

    }

该应用程序显示预期结果,但将位置添加到forloop的每次迭代中。

我试图将位置对象添加到forloop外部的列表中,除了这将把它放在arrayList中的第0个位置,而我的ListView中的第一行返回空数据。

Inside for Loop Outside for loop

1 个答案:

答案 0 :(得分:0)

在循环之前,您正在创建一个ForecastModel的对象并且只填充该位置,但是对于循环内的对象,您将填充其余的字段。

这可能是您从第一个位置获取空值的原因。

您可以使用显示视图所需的所有值正确填充第一个对象。

或者在列表中创建一个单独的类型,只是一个标题,只有一个标签指示城市名称。像here

一样