10

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 notifyDataSetChangedRecyclerView. 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 ContentObserveronChange() 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?

risposta

0

È possibile utilizzare la classe DiffUtils per calcolare le differenze tra il vecchio e il nuovo cursore.

Se lo si usa si solo bisogno di implementare due metodi:

  • areItemsTheSame() per sapere se due elementi rappresentano lo stesso elemento logico (anche se il contenuto è diverso). Solitamente baserai la risposta su un campo identificativo del tuo oggetto;
  • areContentsTheSame() per sapere se due elementi che rappresentano lo stesso oggetto logico hanno contenuto non modificato.

Una volta che le differenze sono calcolati, è possibile poi basta applicarlo alla scheda che verrà automaticamente chiamare il notifyItemChanged(), notifyItemInserted() o notifyItemRemoved() accodingly.

Problemi correlati