6


W nowym RecyclerView możemy użyć wrap_content dla wysokości (lub szerokości). Więc poprawiony błąd Google'a - https://code.google.com/p/android/issues/detail?id=74772
Ale nie wszystko w końcu jest dobrze.
Próbuję użyć animacji dissapearence podczas usuwania elementu z RecyclerView. Używam więc metody Adapter - notifyItemRemoved (int) z dowolnym argumentem, a RecyclerView powoduje NullPointerException.

kod XML:NullPointerException w animacji dissapearence RecyclerView ze wsparcia v.23.2.0

... 
    <RecyclerView 
     android:id="@+id/RecyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scrollbars="vertical" 
     android:overScrollMode="always"/> 
    ... 



kłody:

E/AndroidRuntime: FATAL EXCEPTION: main 
java.lang.NullPointerException 
    at android.support.v7.widget.SimpleItemAnimator.animateDisappearance(SimpleItemAnimator.java:78) 
    at android.support.v7.widget.RecyclerView.animateDisappearance(RecyclerView.java:3246) 
    at android.support.v7.widget.RecyclerView.access$700(RecyclerView.java:147) 
    at android.support.v7.widget.RecyclerView$4.processDisappeared(RecyclerView.java:422) 
    at android.support.v7.widget.ViewInfoStore.process(ViewInfoStore.java:231) 
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:3086) 
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2914) 
    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3277) 
    at android.view.View.layout(View.java:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
    at android.view.View.layout(View.java:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1021) 
    at android.view.View.layout(View.java:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
    at android.view.View.layout(View.java:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
    at android.view.View.layout(View.java:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
    at android.view.View.layout(View.java:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
    at android.view.View.layout(View.java:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
    at android.view.View.layout(View.java:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
    at android.view.View.layout(View.java:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
    at android.view.Choreographer.doFrame(Choreographer.java:532) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
    at android.os.Handler.handleCallback(Handler.java:725) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5227) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
    at dalvik.system.NativeStart.main(Native Method) 



Być może istnieją sposoby ich obejścia temp tych problemów?

EDIT
Starałem się odtworzyć w nowym projekcie. Dlatego nie zgłoszono żadnych wyjątków. Być może w moim projekcie istnieją inne zależności, które nazywają ten problem.

+0

Czy możesz udostępnić kod! – Ajinkya

+0

Mam dokładnie ten sam problem. Chyba jest to błąd w bibliotece wsparcia. Nie animuję nawet moich wpisów w inny sposób niż domyślna animacja w ramach powiadamiania ... metody – mhenryk

+0

Czy można utworzyć raport o błędzie z przykładową aplikacją, która odtwarza problem? – yigit

Odpowiedz

5

Firma Google złożyła oświadczenie na temat użycia narzędzia RecyclerView w wersji 23.2 Biblioteki technicznej.

link do blogu (sprawdź sekcję RecyclerView): http://android-developers.blogspot.com.br/2016/02/android-support-library-232.html

W związku z tą zmianą, należy dokładnie sprawdzić parametry układu swoich poglądów produktu: wcześniej ignorowane parametrów układu (jak MATCH_PARENT w kierunek przewijania) będą teraz w pełni przestrzegane.

Sugerowałbym, aby spróbować zmienić RecyclerView za layout_height param do match_parent. Daj nam znać, czy to działa.

+0

Tak, z match_parent RecyclerView nie powoduje wyjątku. Ale potrzebuję w wrap_content. –

+0

Tak, przeczytałem kilka dyskusji na ten temat, myślę, że powinieneś wypełnić błąd na http://b.android.com, jak zasugerował yigit. –

0

Mam dokładnie taki sam wyjątek. Występuje, gdy dodaję widok do RecyclerView, a widok jest całkowicie poza granicami RecyclerView (użytkownik musiałby przewinąć, aby zobaczyć nowo dodany widok).

Jednak zauważyłem, że ten wyjątek występuje tylko wtedy, gdy szerokość lub wysokość RecyclerView jest wrap_content lub 0dp o masie wartość 1 wewnątrz LinearLayout ... Jeżeli ustawić szerokość i wysokość do dowolnej innej wartości z wyjątkiem tych, dwa, tj. 140dp, match_parent, wtedy wszystko działa poprawnie.

Więc starałem się oszukać ramy buggy i znaleźć rozwiązanie, aby ustawić szerokość mojego RecyclerView być tak duża, jak istnieje przestrzeń w lewo w moim LinearLayout który zawiera RecyclerView (szerokość: 0DP, waga: 1 kombinacja), więc owinął RecyclerView wewnątrz innego LinearLayout z masy ustawiony na 1, i ustaw moich RecyclerView „s szerokość do match_parent, więc robi się tak szeroko jak rodzic LinearLayout można dostać, a rodzic LinearLayout wypełnia wolną przestrzeń w innym rodzicem LinearLayout . I voila, działa idealnie!

Wiem, że to brzmi śmiesznie, ale to jest sposób poradziłem sobie ...

Oto kod źródłowy, jeśli ktoś musi dostać się pomysł, jak rozwiązać ten problem ...

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="10dp" 
    android:gravity="center" 
    android:orientation="horizontal"> 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/pic_grid" 
      android:layout_width="match_parent" 
      android:layout_height="140dp" 
      android:background="#BBB"/> 

    </LinearLayout> 

    <Button 
     android:id="@+id/pic_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/pic_button"/> 

</LinearLayout> 

Teraz RecyclerView jest tak szeroki, jak w jednostce nadrzędnej LinearLayout znajduje się wolna przestrzeń, która zawiera również jeden przycisk po prawej stronie RecyclerView i nie występuje awaria.

Jeśli ktoś dowie się prawdziwą przyczynę takiego wyjątku lub lepszy sposób to naprawić, proszę podzielić ...

8

miałem dokładnie taki sam błąd jak ta podniesiona w pytaniu aw rzeczywistości podniosły błąd w Google dla tego. Po zagłębieniu się w kod frameworku udało mi się rozwiązać problem, zmieniając ustawienie HasFixedSize z FALSE na TRUE, np. "Rv.setHasFixedSize (true)". Zasadniczo jest to powiedzenie RecyclerView, że zmiany w jego zawartości nie zmienią rozmiaru RecyclerView, co pozwoli uniknąć pełnego układu. Pierwotnie ustawiłem to FALSE z powodu błędnej interpretacji jego znaczenia. Ta zmiana usuwa usterkę i jest powtarzalnym rozwiązaniem.

+0

uratowałeś mój dzień ... !! dziękuję dużo kumplowi –

+0

'rv.setHasFixedSize (false);' zrobiłem lewę. Dzięki! – Meet