2013-01-07 23 views
5

我在Android上實現了一個簡單的無限滾動GridView。我有以下組成部分:Android無限滾動網格,適配器是否必須無限增長?

  1. 與onScrollListener,每當GridView控件滾動到最底部一個GridView,我揭開序幕的的AsyncTask到更多的項目加載到我的適配器。
  2. 一個適配器,用於附加從AsyncTask獲取的項目,並觸發notifyDataChanged(),以便GridView自行刷新。

這似乎工作正常,除非在這種情況下適配器正在無限增長......我的意思是我一直追加項目到這個適配器每當用戶滾動到最後,這似乎是一個內存問題。

實現無限適配器的正確方法是什麼?我正在尋找概念,而不是第三方的jar,它爲我做。

感謝

解決方案
被標記的答案有正確的理論。我的實現將加載的數據備份到sqllite數據庫中,因此總體流程是:從線程的互聯網下載數據,將數據解析並存儲到線程的數據庫中,在UI線程上觸發notifyDataChanged。
適配器的getCount()方法只需從數據庫中執行一個select count(id),並從數據庫中一次檢索一批對象到適配器使用的內存中。

+0

嗨。通過任何你解決這個問題的機會,並可以發佈一些代碼? – OWADVL

+0

是的,我把我最後的做法放在*解決方案* – Chao

回答

3

是的,一般如果你的GridView是無限的,那麼你的Adapter是無限的。如果你只是將更多的數據加載到內存中,那麼你肯定會在某個時候遇到內存問題。爲了解決這個問題,你必須在某個時候發佈舊數據。

假設您的適配器可以訪問某些「無限」存儲,從存儲器獲取其數據(通常是互聯網),您可以考慮設置數據的最大大小(以字節或項目計數)您的適配器。當您超過最大尺寸時,您可以從內存中清除舊項目。如果再次請求這些舊項目,則需要從無限存儲中再次加載它們,而不是從內存中加載它們(並且可能會從內存中清除其他舊項目)。

這意味着你GridView項目從Adapter這在某種緩存存儲數據建(LruCache可以在這裏有用),它是由一些(可能是外部)的存儲庫的支持。您還可以在內存緩存和外部存儲之間放置磁盤緩存。

+0

的原始問題中。這絕對是一個鐘聲,我將執行此操作並報告回來。謝謝! – Chao