2013-05-29 16 views
0

我的項目使用SQLiteCursorLoader library from commonsguy將數據從數據庫加載到ListView中。其中的數據是一個簡單的布爾值(只要SQLite支持布爾值...即只有0或1的數字),它告訴複選框的狀態。如果我更改列表中某個複選框的狀態,然後將該項目從列表中滾動出來,則列表項將返回到光標傳入時的狀態,儘管基礎數據庫已更改。如果我更改了一堆複選框的狀態,然後激活列表的MultiChoiceMode,則儘管底層數據庫已更改,但顯示的所有項目都將恢復爲光標最初傳入時的狀態。刷新SQLiteCursorLoader的遊標

有沒有辦法刷新光標? Cursor.requery()已過時,我不希望每次選中複選框時都會創建新的Cursor,這會發生很多情況。我也不確定如何調用restartLoader()幾次才能正常工作,特別是在我使用onLoadFinish()執行某些動畫時。

回答

0

有沒有辦法刷新光標?

致電restartLoader()重新加載數據。

我不希望有每個複選框被選中時,它發生了很多

使用得當創建一個新的光標,一個ListView保持選中狀態爲您服務。您將通過android:choiceMode="multipleChoice"和行Views執行此操作,實現Checkable。目的是在用戶通過某種方式表明他們已經完成了清單清單(例如「保存」操作欄項目)之前不修改數據庫。

我也不確定如何調用restartLoader()多次工作,性能明智,特別是因爲我使用onLoadFinish()來執行一些動畫。

不要多次調用它。理想情況下,將其稱爲零次,直到用戶完成後才更新數據庫,此時您可能正在轉換到用戶界面的其他部分。或者,每個請求的數據庫I/O只調用一次(例如,點擊「保存」)。或者,從使用CursorAdapter轉換爲其他內容,例如從Cursor填充的一組POJO上的其他內容,例如ArrayAdapter,這樣內存中的表示形式除了可單獨持久保存外,還可以修改。

+0

雖然我承認這是一般的好建議,但在我的特殊情況下,建議並不能幫助我。我的應用程序旨在成爲銀行分類帳,它使用關係數據庫來跟蹤所有重要數據,包括用戶是否覈銷了某項以標記交易爲已過帳。列表視圖具有屬性'android:choiceMode =「multipleChoiceModal」',因此用戶可以激活'ActionMode'從數據庫中一次刪除多個項目。如果你願意的話,你可以在這裏查看源代碼:https://bitbucket.org/MowDownJoe/vault-foss – MowDownJoe

+0

@MowDownJoe:「在我的特殊情況下不能幫助我」 - 那麼你需要改變你的情況。無論您是否喜歡,您都需要重新查看遊標或停止使用CursorAdapter。 – CommonsWare