切换到 GSON 后带有空列表的空适配器
Null Adapter with Empty List after switching to GSON
所以我最近将我的大部分 JSON 解析转换为 GSON,因为这是一种非常干净的代码编写方式,同时也提高了性能。
但是,当任何 listView 现在为空时,我在设置适配器时会崩溃。
注意:我已经在使用lv.setEmptyView();
在我的 task
中,我使用 GSON
收集网络数据并将它们塞入 ArrayList<Object>
。
像这样:
// parse result
Gson gson = new Gson();
Type collectionType = new TypeToken<List<Item>>() {}.getType();
ArrayList<Item> myItemsList = gson.fromJson(result.toString(), collectionType);
然后在我的 onPostExecute()
中,当我这样设置 adapter
时:
if (getActivity() != null) {
miAdapter = new MyItemsAdapter(getActivity(), myItemsList,user_num);
lv.setAdapter(miAdapter); // NULL POINTER HERE IF LIST IS EMPTY
}
当此列表为空时,我得到 nullpointer
:
这里是确切的 LogCat
:
04-06 10:21:31.426: E/AndroidRuntime(17691): FATAL EXCEPTION: main
04-06 10:21:31.426: E/AndroidRuntime(17691): Process: com.---.---, PID: 17691
04-06 10:21:31.426: E/AndroidRuntime(17691): java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.widget.ListView.setAdapter(ListView.java:487)
04-06 10:21:31.426: E/AndroidRuntime(17691): at com.---.---.MyItemsFragment$MyItemTask.onPostExecute(MyItemsFragment.java:131)
04-06 10:21:31.426: E/AndroidRuntime(17691): at com.---.---.MyItemsFragment$MyItemTask.onPostExecute(MyItemsFragment.java:77)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.os.AsyncTask.finish(AsyncTask.java:632)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.os.AsyncTask.access0(AsyncTask.java:177)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.os.Handler.dispatchMessage(Handler.java:102)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.os.Looper.loop(Looper.java:135)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.app.ActivityThread.main(ActivityThread.java:5312)
04-06 10:21:31.426: E/AndroidRuntime(17691): at java.lang.reflect.Method.invoke(Native Method)
04-06 10:21:31.426: E/AndroidRuntime(17691): at java.lang.reflect.Method.invoke(Method.java:372)
04-06 10:21:31.426: E/AndroidRuntime(17691): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
04-06 10:21:31.426: E/AndroidRuntime(17691): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
正在设置 adapter
,但是在传递任何空列表时为什么会出现此错误?
- 注意: 我把所有东西都转换成
GSON
后才发现这个错误。但是,我接受它可能在此之前就已经存在的想法,所以可能唯一相关的问题是空列表和 adapter
而不是 GSON
本身。
在您的 onPostExecute 方法中,您正在使用
if (getActivity() != null) {
miAdapter = new MyItemsAdapter(getActivity(), myItemsList,user_num);
lv.setAdapter(miAdapter); // NULL POINTER HERE IF LIST IS EMPTY
}
因此你检查了 activity 但你没有检查 myItemsList 可能为 null 所以,你可以在传递之前像这样初始化空列表到适配器...
if(myItemsList == null){
myItemsList = new ArrayList<Item>();
}
你也可以用其他方式处理这个问题..但这是简单的..
编辑:
实际上原因是当您在适配器中传递列表时
您的适配器的 getCount() 方法将 return 列表的 大小
但是当你在适配器中传递 null 时......它会使应用程序崩溃.. NullPointerxception
因此,您也可以通过检查
进行管理
if(list == null){
return 0;
}else{
return list.size();
}
但是你永远不应该在适配器中传递空列表..
最佳实践:
在从 gson 解析后将列表声明为全局列表并在列表中添加元素,并通知适配器数据集已更改
如果有任何需要请告诉我...
所以我最近将我的大部分 JSON 解析转换为 GSON,因为这是一种非常干净的代码编写方式,同时也提高了性能。
但是,当任何 listView 现在为空时,我在设置适配器时会崩溃。
注意:我已经在使用lv.setEmptyView();
在我的 task
中,我使用 GSON
收集网络数据并将它们塞入 ArrayList<Object>
。
像这样:
// parse result
Gson gson = new Gson();
Type collectionType = new TypeToken<List<Item>>() {}.getType();
ArrayList<Item> myItemsList = gson.fromJson(result.toString(), collectionType);
然后在我的 onPostExecute()
中,当我这样设置 adapter
时:
if (getActivity() != null) {
miAdapter = new MyItemsAdapter(getActivity(), myItemsList,user_num);
lv.setAdapter(miAdapter); // NULL POINTER HERE IF LIST IS EMPTY
}
当此列表为空时,我得到 nullpointer
:
这里是确切的 LogCat
:
04-06 10:21:31.426: E/AndroidRuntime(17691): FATAL EXCEPTION: main
04-06 10:21:31.426: E/AndroidRuntime(17691): Process: com.---.---, PID: 17691
04-06 10:21:31.426: E/AndroidRuntime(17691): java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.widget.ListView.setAdapter(ListView.java:487)
04-06 10:21:31.426: E/AndroidRuntime(17691): at com.---.---.MyItemsFragment$MyItemTask.onPostExecute(MyItemsFragment.java:131)
04-06 10:21:31.426: E/AndroidRuntime(17691): at com.---.---.MyItemsFragment$MyItemTask.onPostExecute(MyItemsFragment.java:77)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.os.AsyncTask.finish(AsyncTask.java:632)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.os.AsyncTask.access0(AsyncTask.java:177)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.os.Handler.dispatchMessage(Handler.java:102)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.os.Looper.loop(Looper.java:135)
04-06 10:21:31.426: E/AndroidRuntime(17691): at android.app.ActivityThread.main(ActivityThread.java:5312)
04-06 10:21:31.426: E/AndroidRuntime(17691): at java.lang.reflect.Method.invoke(Native Method)
04-06 10:21:31.426: E/AndroidRuntime(17691): at java.lang.reflect.Method.invoke(Method.java:372)
04-06 10:21:31.426: E/AndroidRuntime(17691): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
04-06 10:21:31.426: E/AndroidRuntime(17691): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
正在设置 adapter
,但是在传递任何空列表时为什么会出现此错误?
- 注意: 我把所有东西都转换成
GSON
后才发现这个错误。但是,我接受它可能在此之前就已经存在的想法,所以可能唯一相关的问题是空列表和adapter
而不是GSON
本身。
在您的 onPostExecute 方法中,您正在使用
if (getActivity() != null) {
miAdapter = new MyItemsAdapter(getActivity(), myItemsList,user_num);
lv.setAdapter(miAdapter); // NULL POINTER HERE IF LIST IS EMPTY
}
因此你检查了 activity 但你没有检查 myItemsList 可能为 null 所以,你可以在传递之前像这样初始化空列表到适配器...
if(myItemsList == null){
myItemsList = new ArrayList<Item>();
}
你也可以用其他方式处理这个问题..但这是简单的..
编辑:
实际上原因是当您在适配器中传递列表时
您的适配器的 getCount() 方法将 return 列表的 大小
但是当你在适配器中传递 null 时......它会使应用程序崩溃.. NullPointerxception
因此,您也可以通过检查
进行管理if(list == null){
return 0;
}else{
return list.size();
}
但是你永远不应该在适配器中传递空列表..
最佳实践:
在从 gson 解析后将列表声明为全局列表并在列表中添加元素,并通知适配器数据集已更改
如果有任何需要请告诉我...