Con ListView
abbiamo avuto un buon modello nativo di mappare alcuni dati da db per elencare:Come utilizzare ContentObserver con RecyclerView?
DB
->ContentProvider
->CursorLoader
->CursorAdapter
->ListView
Questo approccio è stato buono in termini di livello di dati separazione, prestazioni e aggiornamenti automatici dei dati. Ma questo schema non si adatta in realtà al nuovo RecyclerView
. Ci sono alcuni approcci per mimare vecchio comportamento:
Using the recyclerview with a database
Ma c'è un problema con l'utilizzo di vecchio stile con notifyDataSetChanged
RecyclerView
. Non può utilizzare le funzionalità ItemAnimator, perde la posizione di scorrimento ed è semplicemente inefficace.
Quindi, come possiamo beneficiare di notifiche di modifica finegraned durante l'utilizzo di DB avvolto in ContentProvider
? Cursor
è statico e per ottenere nuovi dati da esso è necessario ottenere il nuovo Cursor
. Così, sembra che avremo bisogno di uno strato intermedio di dati personalizzati, che unire i dati provenienti da cursori ed esporre la List
di entità da RecyclerView.Adapter
. Inoltre, dovremo mappare manualmente gli eventi ContentObserver
onChange()
alle notifiche di RecyclerView. Ciò significa anche che dovremo sbarazzarci di CursorLoader. Questa è una quantità incredibile di lavoro per un compito così fondamentale.
C'è qualche soluzione migliore?