2013-02-26 59 views
0

我有通過CursorLoader填充的listview。 CursorLoader由LoaderManager.LoaderCallback的createLoader方法創建。我對此沒有任何問題。問題在於我想在listview填充完成時開始另一項任務,並使用其他數據填充列表視圖。 我目前的解決方案是在onLoadFinished方法中啓動另一個加載器。從另一個加載程序啓動加載程序。對還是錯?

這是正確的解決方案還是可以以更優雅高效的方式完成?你可以給一些建議,因爲我沒有太多的android開發經驗。 在此先感謝。

+0

爲什麼首先需要2次調用來獲取數據?啓動第二個加載程序的觸發器是什麼?它是否會顯示更多數據的某種列表項單擊? – Sean 2013-02-26 19:12:25

+0

我可以看到,您只想爲列表視圖中的可見項目執行此操作。但是,如果您在初始列表數據之後立即加載所有項目的附加數據,那麼只需在同一個加載程序中一步完成。 – 2013-02-26 19:12:52

+0

@Sean事情是,我第一次負載收集通話記錄,並在第二我收集每個電話號碼的其他信息,如地點 – Azat 2013-02-26 19:35:09

回答

3

onLoadFinished加載將無任何問題。我在一個寵物項目中做了類似的事情。我從我自己的ContentProvider加載數據,然後從手機的Contact ContentProvider加載聯繫人數據。我的數據庫中的每個條目都可以引用多個聯繫人,所以我必須先加載我的項目,然後才能知道要加載的聯繫信息。當我第一次收到onLoadFinished中的項目數據時,我將init/restart LoaderManager調用鏈接起來。它工作得很好,我之後使用聯繫人數據作爲列表。當然,我沒有使用這種方法將數據加載到現有列表視圖項目的視圖中。我在我的物品的詳細視圖中使用了自己列表中的數據。它應該仍然可以處理你想要做的事情,但是它可能會混亂地將數據附加到視圖和內容,特別是因爲視圖「生命週期」不在你的控制範圍之內。

一個更好的方法IMO可能會編寫一個自定義的CursorAdapter,它可以在創建視圖時使用AsyncTask或AsyncQueryHandler來獲取額外的數據。確保在列表滾動時緩存數據供隨後使用。第二種方法具有獨立於外部/輔助裝載機的優點。它封裝了顯示所需數據所需的所有邏輯,其中包括加載缺少的部分。它保持視圖數據和顯示邏輯的一致性,安全地隱藏在可重用模塊內。

+0

感謝您的回覆,所以在第二種方法中,列表中的每一行都會有一個新的異步任務?如果是這樣,它會不會影響低端設備的性能? – Azat 2013-02-27 07:36:59

+0

我提到AsyncTask作爲例子。如果你的加載任務相對較短(幾秒鐘),那麼它應該不成問題。而且,就像我之前說過的那樣,緩存結果,以便每次滾動視圖時都不需要獲取結果。如果您的任務需要更多時間來完成或執行更長的操作,則應考慮使用[ThreadPoolExecutor](http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html)。它們提供了一個更高效和可控的多線程解決方案,並且可以非常有用地檢查線程。 – ebarrenechea 2013-02-27 14:20:27