5

Ho scritto il mio CursorAdapter per RecyclerView come seguente link: https://gist.github.com/skyfishjy/443b7448f59be978bc59Come visualizzare i dati dal database in un RecyclerView ad alte prestazioni?

Poi ho trovato ogni volta che cambia qualcosa nel database e voglio dimostrare in RecyclerView, ho bisogno di creare un nuovo cursore da db.query() e l'uso CursorAdpater's changeCursor(). Poiché query() esegue la scansione di tutte le righe nel database, RecyclerView si aggiornerà lentamente quando l'importo dei dati è elevato anche se inserisco solo una riga nel database.

Inoltre, come tutti sappiamo, RecyclerView fornisce notifyItemInserted/Removed (position) per gli sviluppatori in modo che RecyclerView possa essere aggiornato parzialmente, il che è utile e vantaggioso per la memoria/tempo. Tuttavia, quando uso CursorAdapter, non so quando e come posso usare questi metodi perché il cambiamento del cursore non aggiunge qualcosa direttamente al binding del dataset con RecyclerView ma aggiorna tutti gli elementi in effetti.

Quindi ci sono modi migliori per mostrare i dati dal database in RecyclerView e utilizzare il metodo di miglioramento di RecyclerView per mostrare una varietà di database?

risposta

4

Posso dirti cosa ho fatto ... A. Ha caricato un cursore usando Caricatore. B. Copiato il cursore nell'arrayist che è collegato all'adattatore (il cursore non è collegato direttamente all'adattatore), chiudere il cursore. Funziona bene se non ci sono molti dati - se ci sono molte righe allora vorrei caricarne un po 'nell'arrayylist e poi, quando l'utente scorrerebbe verso il basso, farei nuovamente una query e caricherò dall'ultima riga dell'array. C. Quando l'utente desidera eliminare o aggiungere qualcosa che vorrei fare l'operazione su arrayList prima (UI filo) notifiyItemChanged e quindi modificare il db (filo Torna) Speranza ho aiutato.

+0

Ho considerato gli stessi pensieri dei tuoi ma non sono i metodi migliori. In primo luogo, CursorLoader è progettato per l'aggiornamento dei dati che possono cambiare in qualsiasi momento. Nella mia situazione, so quando aggiornare i dati e l'interfaccia utente, quindi se utilizzo CursorLoader, verrà creato un altro thread e quindi spreco risorse. In secondo luogo, sembra facile copiare i dati dal cursore su una lista di array, ma ha lo stesso problema: spreco di memoria perché in questo caso non è necessario l'arrayList ---- perché dovrei usare un arrayList se c'è un cursore per fornire i dati? Infine, il passaggio C potrebbe causare errori. – ywwynm

+0

Inizierò dalla fine, il passaggio c non causa un errore se eseguito correttamente. Ho copiato l'array perché volevo avere la funzione 'swipe do delete' e non mi piace davvero tanto di modificare il DB sul thread principale. Forse è uno "spreco" di memoria (forse) ma è efficace con l'uso dell'interfaccia utente. Ancora una volta, penso che un altro array qui e là è molto più economico quindi eliminando una riga nel DB sull'interfaccia utente. – EE66

+0

Sto per seguire il tuo consiglio. Ma ho pensato a qualcosa di nuovo: carica il cursore, copia i dati in un arrayList in Activity's onCreate() e collegalo a RecyclerView.Adapter. Quindi, quando voglio modificare i dati sul thread dell'interfaccia utente, aggiorno solo l'arraylist. Alla fine, in Activity's ontop(), inserirò tutti i dati di arrayList nel database (inserirne di nuovi, aggiornare quelli modificati e mantenere quelli esistenti). È meglio? – ywwynm