10

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

Odpowiedz

0

Możesz użyć klasy DiffUtils, aby obliczyć różnice między starym a nowym kursorem.

Kiedy go przy użyciu wystarczy zaimplementować dwie metody:

  • areItemsTheSame() wiedzieć, czy dwie pozycje reprezentują ten sam element logiczny (nawet jeśli treść jest inna). Zwykle opierałbyś odpowiedź na polu identyfikacyjnym swojego przedmiotu;
  • areContentsTheSame() wiedzieć, czy dwie pozycje reprezentujące ten sam element logiczny mają niezmodyfikowaną zawartość.

Gdy różnice są obliczane można następnie po prostu zastosować go do adaptera, a zostanie ona automatycznie wywołać notifyItemChanged(), notifyItemInserted() lub notifyItemRemoved() accodingly.

Powiązane problemy