2016-10-26 6 views
5

Wszystkie widoki recyclerviews czasami się zawieszają, gdy szybko przewijam listę, ponieważ zaktualizowałem ją, aby obsługiwać bibliotekę 25.0.0. Nie ma animator układ i wszystko działało w porządku, z wsparcia lib < 25."Wyświetlenia zgrupowane lub załączone nie mogą być poddane recyklingowi", ponieważ wsparcie dla biblioteki lib 25.0.0

jest wyjątek w RecyclerView, ponieważ holder.itemView.getparent() nie jest null

if (holder.isScrap() || holder.itemView.getParent() != null) { 
      throw new IllegalArgumentException(
        "Scrapped or attached views may not be recycled. isScrap:" 
          + holder.isScrap() + " isAttached:" 
          + (holder.itemView.getParent() != null)); 
     } 

Czy ktoś inny doświadczyłeś tego zachowania?

+0

Możesz mieć więcej szczęścia, jeśli podasz [mcve] demonstrujący problem, wraz z pełnym śladem stosu awarii. – CommonsWare

+0

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

+1

BTW I tylko napotkać ten problem pod GridLayoutManager. Gdzie używam LinearLayoutManager, wszystko wygląda dobrze. – Anthonyeef

Odpowiedz

8

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ść.

+0

chciałbyś mi pomóc z quesiton http://stackoverflow.com/questions/41408085/gapworker-with-scrapped-or-attached-views-may-not-be-recycled-isscrapfalse-isa – TheReprator

0

Może się również zdarzyć, jeśli ustawisz android:orientation="horizontal" na RecyclerView w XML. Usunięcie go zapobiegnie awarii.

+0

Każdy, kto chce to sprzeciwić , dodaj tę linię do swojego 'RecyclerView' i sprawdź, czy dostałeś tę awarię. –

Powiązane problemy