Aby zapobiec katastrofie od tego problemu, trzeba zadzwonić setHasStableIds(boolean)
z karty i przekazać parametr jako prawdziwe:
adapter.setHasStableIds(true);
Objaśnienie: Problem pojawia się, gdy nazywają adapter.notifyDataSetChanged();
recyclerView
następnie wywołuje detachAndScrapAttachedViews(recycler);
Tymczasowo odłącza i usuwa wszystkie aktualnie przyłączone widoki podrzędne. Widoki zostaną złomowane na dane Recycler
. Model Recycler
może preferować ponowne wykorzystanie widoków złomu.
Następnie wywoływana jest nazwa scrapOrRecycleView(recycler, (int) position, (View) child);
. Ta funkcja sprawdza, czy "hasStableIds" ma wartość true lub false. Jeśli jest to fałsz, pojawia się następujący błąd:
"Nie można ponownie wykorzystać makulatury ani załączonych widoków."
Stabilne Identyfikatory pozwalają View
(RecyclerView
, ListView
, itd.) W celu optymalizacji dla przypadku, gdy elementy pozostają takie same między notifyDataSetChanged
połączeń. hasStableIds() == true
wskazuje, czy identyfikatory pozycji są stabilne w przypadku zmian w podstawowych danych.
Jeśli identyfikatory pozycji są stabilne, można je ponownie wykorzystać za pomocą widoku, tj. "Poddane recyklingowi", dzięki czemu proces ponownego renderowania po wywołaniu notifyDataSetChanged()
jest skuteczny. Jeśli identyfikatory przedmiotów nie są stabilne, nie ma gwarancji, że przedmiot został poddany recyklingowi, ponieważ nie ma możliwości ich śledzenia.
Uwaga: Ustawienie setHasStableIds()
na wartość true nie jest sposobem na żądanie stabilnych identyfikatorów, ale wskazanie widokom Recyklera/Listy/Siatek, które zapewniają wspomnianą stabilność.
Możesz mieć więcej szczęścia, jeśli podasz [mcve] demonstrujący problem, wraz z pełnym śladem stosu awarii. – CommonsWare
ten sam problem tutaj i to również stało się po aktualizacji biblioteki wsparcia do wersji 25.0.0. Niektóre treści tworzą tutaj problem: https://code.google.com/p/android/issues/detail?id=226353&can=1&q=reportedby%3DDeveloper%20-has%3Atriaged%20-has%3Apriority%20component%3DSupport -Files% 20-ma% 3Ablocked & colspec = ID% 20Status% 20Priority% 20Owner% 20Podsumowanie% 20Stars% 20Reporter% 20Opened & start = 1400, ale wygląda na to, że zespół biblioteki wsparcia Google go zamyka od czasu braku kroku reprodukcji. – Anthonyeef
BTW I tylko napotkać ten problem pod GridLayoutManager. Gdzie używam LinearLayoutManager, wszystko wygląda dobrze. – Anthonyeef