Z ListView
mieliśmy dobrą natywną wzór mapować niektóre dane z db do listy:Jak korzystać z ContentObserver z RecyclerView?
DB
->ContentProvider
->CursorLoader
->CursorAdapter
->ListView
Podejście to było dobre pod względem warstwy danych separacja, wydajność i automatyczne aktualizacje danych. Ale ten wzór nie pasuje do nowego RecyclerView
. Istnieje kilka metod, aby naśladować starego zachowania:
Using the recyclerview with a database
Ale jest problem z korzystaniem ze starym stylu notifyDataSetChanged
RecyclerView
. Nie może korzystać z funkcji ItemAnimator, traci pozycję przewijania i jest po prostu nieskuteczny.
W jaki sposób możemy korzystać z powiadomień o zmianach w zestawieniu w trakcie korzystania z bazy danych DB opakowanej w ContentProvider
? Cursor
jest statyczny, a aby uzyskać z niego nowe dane, musimy uzyskać nowe Cursor
. Wygląda więc na to, że potrzebujemy niestandardowej pośredniej warstwy danych, która połączy dane od kursorów i wystawi jednostki List
na RecyclerView.Adapter
. Ponadto będziemy musieli ręcznie mapować zdarzenia ContentObserver
onChange()
do powiadomień RecyclerView. Oznacza to również, że będziemy musieli pozbyć się CursorLoader. To jest niesamowita ilość pracy dla tak podstawowego zadania.
Czy istnieje lepsze rozwiązanie?