切换到GSON后具有空列表的空适配器

时间:2015-04-06 17:29:02

标签: android 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.access$600(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本身。

1 个答案:

答案 0 :(得分:1)

onPostExecute 方法中,您正在使用

if (getActivity() != null) {
     miAdapter = new MyItemsAdapter(getActivity(), myItemsList,user_num);
     lv.setAdapter(miAdapter);  // NULL POINTER HERE IF LIST IS EMPTY
}

因此你检查了活动,但是你没有;检查 myItemsList 可能是null所以,你可以像这样初始化空列表,然后再将它传递给适配器......

if(myItemsList == null){
     myItemsList = new ArrayList<Item>();
}

你也可以用其他方式处理这个问题..但这很简单..

修改:

实际上原因是你在适配器中传递列表 适配器的 getCount()方法将返回列表大小
但是当您在适配器中传递null时...它会使应用程序崩溃.. NullPointerxception

所以,您也可以通过检查

来管理这一方
if(list == null){
     return 0;
}else{
     return list.size();
}

永远不应该传递适配器中的空列表 ..

最佳做法:

声明您的列表全局并在从gson解析后添加列表中的元素并通知适配器更改数据集

如果有任何需要,请告诉我......