2015-04-06 46 views
0

因此,我最近将大部分JSON解析转换为GSON,因为它是一种非常干净的编写代码和性能的方法。切换到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本身。
+0

您可以使用'setEmptyview'处理空虚。 http://cyrilmottier.com/2011/06/20/listview-tips-tricks-1-handle-emptiness/。但你应该检查为什么你的列表是空的,并修复它 – Raghunandan

+0

@Raghunandan我实际上正在使用'setEmptyView'(我编辑上面做笔记)。另外,在这些情况下,“ListView”是空的是完全合法的。 – KickingLettuce

+0

下面的博客文章应该有助于缩小问题 – Raghunandan

回答

1

在你onPostExecute方法使用的是

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

因此你不得不检查活动,但你不;吨把检查myItemsList可以为空的话,你可以在这里初始化空列表像这样,然后再将它传递给适配器...

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

您可以用其他方式处理问题......但这是简单的..

编辑:

其实原因是,当你路过名单适配器 适配器的getCount将()方法将返回大小列表
的,但是当你在适配器中传递null ...它会使应用程序崩溃... NullPointerxception

因此,您可以在该方面管理以及通过将检查

if(list == null){ 
    return 0; 
}else{ 
    return list.size(); 
} 

但你不应该通过适配器的空列表。

对于最佳实践:

声明列表全球和列表从GSON解析之后添加元素和数据集改变通知适配器

让我知道,如果有什么需要...

+0

我曾想到这一点,当然会这样做,但它似乎并没有解决更大的问题。纠正我,如果我错了? – KickingLettuce

+1

pl检查我的编辑的更多细节.. –

+0

好吧,你的原始答案是足够的,我重新读后,我想当我更新我的代码与GSON的东西我移动了一些东西,并忘记最初实例化我的列表'new ArrayList ();' – KickingLettuce