我正在尝试在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中的第一行返回空数据。
答案 0 :(得分:0)
在循环之前,您正在创建一个ForecastModel
的对象并且只填充该位置,但是对于循环内的对象,您将填充其余的字段。
这可能是您从第一个位置获取空值的原因。
您可以使用显示视图所需的所有值正确填充第一个对象。
或者在列表中创建一个单独的类型,只是一个标题,只有一个标签指示城市名称。像here
一样