2016-06-21 92 views
0

我想用異步檢索數據的數據填充listView, 問題是如果我設置適配器,它會拋出空指針,因爲數據當我接收數據時,一個方法被執行,所以我可以調用這個方法來填充我的列表視圖?我嘗試傳遞佈局到這個類直接填充列表視圖時,數據收到但沒有工作(什麼都沒有發生)等待從數據庫異步獲取數據以填充列表視圖的方法的最佳方法

我認爲使用AsyncTask是一個好主意添加wait(),當這個「檢索器數據方法「是觸發呼叫通知(),但我不知道如何從另一個類的異類ASK呼叫通知()...

我也不知道如果asynktask是這樣做的最好方法,任何想法? 我使用retrofit2如果它可以幫助

列表視圖的代碼創建/填充

private List<TmOfsDTO> prepareList() { 
    List<TmOfsDTO> list; 
    try { 
     // Create list of items 
     ListObtainer listObtainer = new ListObtainer(this); 
     list = listObtainer.getTmOfsDTOList(user); // this method returns list of objects from DB 
    } catch (Exception e) { 
     list = null; 
     e.printStackTrace(); 
    } 
    return list; 
} 

private void populateListView(List<TmOfsDTO> lista) { 

    // Build Adapter 
    OrderAdapter orderAdapter = new OrderAdapter(this, 0, lista); 
    // orderAdapter.getView() 

    Log.d("LSO", "....."); 
    // Configure listview 
    //View rootView = View.inflate(this, R.layout.activity_ordenes, null); 
    ListView listView = (ListView) findViewById(R.id.lvOrdenes); 
    listView.setAdapter(orderAdapter); 
    //listView.invalidateViews(); 
    //listView.refreshDrawableState(); 
    Log.d("LSO", "......."); 

最後更新時間:
** 我在做正確的,當我recieving數據的通知,傳遞適配器,並調用: orderAdapter.notifyDataSetChanged();

但問題是我缺少添加每個項目: orderAdapter.add(orden);

前通知,現在似乎工作好**

+0

加載程序,閱讀關於加載程序框架 – pskink

+0

「問題是,如果我設置適配器,它會拋出空指針,因爲數據還沒有滿意」 - 這部分聽起來很可疑。如果你有一個有效的適配器,數據是否已經到達應該沒關係(只有在數據被添加到適配器之前,它纔會在列表中顯示任何內容) –

+0

您能否通過相關的logcat部分?和匹配的代碼段? – QVDev

回答

0

正如你logcat上面的lista顯示爲空。您正在將此列表傳遞給適配器。但是如果你沒有初始化變量lista它會拋出一個空指針異常。

建議初始化傳遞給適配器的List。然後,當數據進入你添加數據lista並調用該方法adapter.notifyDataSetChanged()

繼似乎因此導致空指針異常

} catch (Exception e) { 
     list = null; 
     e.printStackTrace(); 
} 

初始化你也應該不分配空的旁邊。

+0

在catch中處理錯誤的代碼設計不是一個可靠的解決方案。 – someUser

+0

如何在接收數據時調用adapter.notifyDataSetChanged()如果在調用getListFromDB方法之後創建適配器? – MikeOx

+0

使OrderAdapter orderAdapter類變量,然後當您收到您設置的數據orderAdapter.setDayaSetChanged() – QVDev

0

你最好使用RecyclerView,反正。這是新的支持庫的一部分,比舊的ListView更高效。

這裏的一些關鍵問題是數據庫是否是本地的。如果你的手機上有一個sqlite3數據庫,那麼你應該編寫一些類將數據庫信息加載到對象中,這些對象可以存儲到一個數組中,並非常容易地傳遞到RecyclerView.Adapter中。

如果您正在遠程加載,那麼在嘗試加載RecyclerView之前,使用AsyncTask將數據同步到手機上將會100%更好,否則您會得到這些錯誤。

您可以從遠程數據庫中將一個項目加載到ArrayList中,並將其傳遞給RecyclerView,然後從遠程數據庫繼續加載,並通知RecyclerView對每個項目添加到列表中的更改。

+0

加入sqlite並將其與遠程數據庫同步聽起來不錯...但現在需要太多的時間來實現,我需要一個更簡單的解決方案,因爲我需要今天的listview工作 – MikeOx

0

爲您的適配器創建不同的構造函數,它不會接收要在其中顯示的數據。當你有這個,它不會崩潰。

爲了讓您的數據裏面,創建項目的本地List和喜歡的東西來填充它:

public void setData(List<MyObject> data){ 
this.mData = data; 
notifyDataSetChanged(); 
} 

另外,不要忘記方法,如的getItem處理可能的空指針錯誤。

0

讓我們說我們在viewDidLoad方法。我建議你做到以下幾點:

    在適配器類
  • 創建公有方法:使用setData,這就要求adapter.notifyDataSetChanged()
  • 發送請求通過傳遞迴調函數到後端
  • 顯示加載/進度對話框
  • 通過傳遞空數組來初始化適配器(非空)
  • 當回調被觸發時,您將獲得列表調用適配器的setData並隱藏進度對話框。
+0

「通過傳遞迴調函數向後端發送請求」我該怎麼做 – MikeOx

+0

通過使用委託或其他回調機制。 – someUser

相關問題