5

我寫我自己的CursorAdapter爲RecyclerView像以下鏈接:https://gist.github.com/skyfishjy/443b7448f59be978bc59如何將數據從數據庫顯示到具有高性能的RecyclerView?

然後我發現每當我改變數據庫的東西,要顯示它在RecyclerView,我需要建立由db.query一個新的光標()和使用CursorAdpater的changeCursor()。由於query()將掃描數據庫中的所有行,因此即使只向數據庫中插入一行,數據量也很大時,RecyclerView將會緩慢刷新。我們都知道,RecyclerView爲開發者提供了notifyItemInserted/Removed(position),這樣RecyclerView可以部分刷新,這對內存/時間是有用的和有益的。但是,當我使用CursorAdapter時,我不知道何時以及如何使用這些方法,因爲更改遊標並不直接向使用RecyclerView的數據集綁定添加內容,而是實際刷新所有項目。

那麼有沒有更好的方法來顯示數據庫中的數據在RecyclerView中,並使用RecyclerView的改進方法來顯示各種數據庫?

回答

4

我可以告訴你我做了什麼... A.使用Loader加載遊標。 B.將光標複製到與適配器連接的ArrayList中(遊標未直接連接到適配器),關閉遊標。如果不存在大量數據,則工作良好 - 如果有很多行,那麼我會將一些數據加載到數組列表,然後當用戶向下滾動時,我會再次查詢並從數組的最後一行加載。當用戶想要刪除或添加一些東西時,我會先對arrayList進行操作(UI線程)notifiyItemChanged然後更改db(返回線程) 希望我能幫上忙。

+0

我考慮過和你一樣的想法,但它們不是最好的方法。首先,CursorLoader專爲刷新可能隨時改變的數據而設計。在我的情況下,我知道何時刷新數據和UI,所以如果我使用CursorLoader,則會創建另一個線程,從而浪費資源。其次,將遊標中的數據複製到arrayList似乎很容易,但它有相同的問題:內存浪費,因爲在這裏實際上不需要arrayList ----如果有遊標提供數據,爲什麼我應該使用arrayList?最後,步驟C可能會導致錯誤。 – ywwynm

+0

我會從最後開始,如果正確完成,步驟c不會導致錯誤。 我已經複製了數組,因爲我想'刷卡做刪除'功能,我真的不喜歡在主線程上對數據庫做任何改變。它可能是一種'浪費'的內存(可能),但它對UI的使用很有效。再次,我認爲另一個數組在這裏和那裏有一個便宜,然後刪除用戶界面上的數據庫中的一行。 – EE66

+0

我即將接受你的建議。但是我想到了一些新的東西:加載遊標,將數據複製到Activity的onCreate()中的arrayList並將其與RecyclerView.Adapter綁定。然後,當我想更改UI線程上的數據時,我只更新arrayList。最後,在Activity的onStop()中,我會將arrayList的所有數據放入數據庫(插入新數據,更新已更改數據並保留現有數據)。好點嗎? – ywwynm

相關問題