我一直在关注udacity的课程并且已经完成了第2课。该程序应该使用JSON
上现在已解析的数据更新列表视图。除非添加以下代码,否则程序崩溃:
@Override
protected void onPostExecute(String[] result) {
if (result != null) {
forecastAdapter.clear();
for (String dayForecastStr : result) {
forecastAdapter.add(dayForecastStr);
}
}
}
如果该代码不存在,程序将照常运行并记录json解析的结果。其他人建议
“确保您没有在”onCreateView“中重新定义mForecastAdapter 并且只有:mForecastAdapter = new ArrayAdapter“
我不确定如何领先于此。我班上已经有mForecastAdapter = new ArrayAdapter<string>
了。而oncreateview上的其余代码只是将数组加载到listview中。
我目前的错误日志是:
11-05 19:29:00.049 20310-20553 / com.example.jeremy.sunshine V / FetchWeatherTask:预测参赛作品:11月5日星期三 - 清除 - 7/7 11-05 19:29:00.049 20310-20553 / com.example.jeremy.sunshine V / FetchWeatherTask:预测参赛作品:11月6日星期四 - 雨 - 12/9 11-05 19:29:00.049 20310-20553 / com.example.jeremy.sunshine V / FetchWeatherTask:预测参赛作品:11月7日星期五 - 雨 - 12/10 11-05 19:29:00.049 20310-20553 / com.example.jeremy.sunshine V / FetchWeatherTask:预测参赛作品:11月8日星期六 - 雨 - 12/11 11-05 19:29:00.049 20310-20553 / com.example.jeremy.sunshine V / FetchWeatherTask:预测参赛作品:11月9日星期日 - 雨 - 15/11 11-05 19:29:00.049 20310-20553 / com.example.jeremy.sunshine V / FetchWeatherTask:预测参赛作品:周一,11月10日 - 晴朗 - 15/12 11-05 19:29:00.049 20310-20553 / com.example.jeremy.sunshine V / FetchWeatherTask:预测条目:11月11日星期二 - 晴 - 15/11 11-05 19:29:00.049 20310-20310 / com.example.jeremy.sunshine D / AndroidRuntime:关闭VM 11-05 19:29:00.049 20310-20310 / com.example.jeremy.sunshine W / dalvikvm:threadid = 1:线程退出未捕获的异常 (组= 0x415c5db8)11-05 19:29:00.049 20310-20310 / com.example.jeremy.sunshine E / AndroidRuntime:致命 例外:主要 处理:com.example.jeremy.sunshine,PID:20310 显示java.lang.NullPointerException 在com.example.jeremy.sunshine.ForecastFragment $ FetchWeatherTask.onPostExecute(ForecastFragment.java:305) 在com.example.jeremy.sunshine.ForecastFragment $ FetchWeatherTask.onPostExecute(ForecastFragment.java:108) 在android.os.AsyncTask.finish(AsyncTask.java:632) 在android.os.AsyncTask.access $ 600(AsyncTask.java:177) 在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:645) 在android.os.Handler.dispatchMessage(Handler.java:102) 在android.os.Looper.loop(Looper.java:136) 在android.app.ActivityThread.main(ActivityThread.java:5146) at java.lang.reflect.Method.invokeNative(Native Method) 在java.lang.reflect.Method.invoke(Method.java:515) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:796) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) 在dalvik.system.NativeStart.main(本地方法)
我的全班同学都可以在这里看到:
由于这是我的第一个android项目,我很困惑为什么这不起作用。我认为我必须忽视它。http://pastebin.com/x3rcqbdS
答案 0 :(得分:3)
使用以下代码初始化forecastAdapter
中的onCreateView
时:
ArrayAdapter<String> forecastAdapter =
new ArrayAdapter<String>(
您正在创建forecastAdapter
的新实例,该实例仅在onCreateView
的范围内。然后,当您在forecastAdapter
中使用onPostExecute
时,forecastAdapter
范围内的onPostExecute
为空,因为它从未初始化,但另一个实例是(如Elliott Frisch提到,他刚刚删除了他的答案)。
您应该只能从ArrayAdapter<String>
适配器中删除onCreateView
,它就能正常运行。
答案 1 :(得分:0)
我遇到了同样的问题。解决方案是您不能向mForecastAdapter
添加列表,因为根据旧代码,我们添加String[]
而不是weekForecast
列表。因此,请确保此行正确:
mForecastAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast, R.id.list_item_forecast_textview,weekForecast);
答案 2 :(得分:0)
之前我遇到过这个问题。 数组适配器不是null,因为我可以访问它的计数,但我无法清除它或添加元素。这是因为我在onCreateView()方法中初始化我的数组适配器的方式。我将最后一个参数传递给了“Arrays.asList(my_array_of_strings)”
String[] data = {
"Mon 6/23 - Sunny - 31/17",
"Tue 6/24 - Foggy - 21/8",
"Wed 6/25 - Cloudy - 22/17",
"Thurs 6/26 - Rainy - 18/11",
"Fri 6/27 - Foggy - 21/10",
"Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18",
"Sun 6/29 - Sunny - 20/7"
};
arrayAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast,
R.id.list_item_forecast_textview, Arrays.asList(data));
而最后一个参数应该是“new ArrayList(Arrays.asList(my_array_of_strings))”
String[] data = {
"Mon 6/23 - Sunny - 31/17",
"Tue 6/24 - Foggy - 21/8",
"Wed 6/25 - Cloudy - 22/17",
"Thurs 6/26 - Rainy - 18/11",
"Fri 6/27 - Foggy - 21/10",
"Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18",
"Sun 6/29 - Sunny - 20/7"
};
List<String> weekForecast = new ArrayList<String>(Arrays.asList(data));
arrayAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast,
R.id.list_item_forecast_textview, weekForecast);
这是因为Arrays.asList(array)和new ArrayList(Arrays.asList(array)之间的区别如here所述。