2015-04-06 48 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