6


Nel nuovo RecyclerView possiamo usare wrap_content per altezza (o per larghezza). Quindi Google ha corretto un bug - https://code.google.com/p/android/issues/detail?id=74772
Ma non tutto va bene alla fine.
Cerco di utilizzare l'animazione di scomparsa quando rimuovi l'elemento da RecyclerView. Quindi uso il metodo di Adapter - notifyItemRemoved (int) con qualsiasi argomento e RecyclerView causa NullPointerException.

codice Xml:NullPointerException in animazione dissapearence di RecyclerView dal supporto 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"/> 
    ... 



Logs:

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) 



Forse ci sono soluzioni alternative temporanee di questi problemi?

EDIT
ho cercato di riprodurre in nuovo progetto. Quindi nessuna eccezione è stata lanciata. Forse nel mio progetto ci sono altre dipendenze che chiamano questo problema.

+0

Puoi condividere il codice! – Ajinkya

+0

Ho lo stesso identico problema. Immagino sia un bug nella libreria di supporto. Non animo nemmeno le mie voci in nessun altro modo rispetto all'animazione predefinita nei metodi notifica ... – mhenryk

+0

Puoi creare una segnalazione di bug con un'app campione che riproduce il tuo problema? – yigit

risposta

5

Google ha rilasciato alcune dichiarazioni sull'utilizzo di RecyclerView con la versione 23.2 della Libreria di supporto.

link al post del blog (consultare la sezione RecyclerView): http://android-developers.blogspot.com.br/2016/02/android-support-library-232.html

A causa di questo cambiamento, assicurarsi di ricontrollare i parametri di layout dei vostri punti di vista voce: parametri di layout precedentemente ignorati (come MATCH_PARENT in la direzione di scorrimento) sarà ora pienamente rispettata.

io vi suggerisco di provare a cambiare layout_height param del RecyclerView a match_parent. Facci sapere se funziona.

+0

Sì, con match_parent RecyclerView non causa eccezioni. Ma ho bisogno di wrap_content. –

+0

Sì, ho letto alcune discussioni a riguardo, penso che dovresti riempire un bug su http://b.android.com, come suggerito da yigit. –

0

Ho esattamente la stessa eccezione. Si verifica quando aggiungo una vista allo RecyclerView e quella vista è completamente oltre i limiti dello RecyclerView (l'utente dovrebbe scorrere per visualizzare quella vista appena aggiunta).

Tuttavia, ho notato che questa eccezione si verifica solo quando larghezza o altezza della RecyclerView è wrap_content o 0dp con peso impostato a 1 all'interno di un LinearLayout ... Se regolo la larghezza e l'altezza per qualunque valore eccetto quelli due, ovvero 140dp, match_parent, quindi tutto funziona correttamente.

Così, ho cercato di ingannare il quadro buggy e trovare una soluzione per impostare la larghezza della mia RecyclerView ad essere grande come ci sono spazio lasciato dentro la mia LinearLayout che contiene il RecyclerView (larghezza: 0DP, peso: 1 combinazione), così ho avvolto il RecyclerView all'interno di un altro LinearLayout con il peso impostato a 1, e insieme S' i miei RecyclerView larghezza match_parent, quindi diventa larga come genitore LinearLayout può ottenere, e il genitore LinearLayout riempie lo spazio libero in un altro genitore LinearLayout . E voilà, funziona perfettamente!

Lo so, suona ridicolo, ma questo è il modo in cui ho lavorato fuori ...

Ecco il codice sorgente, se qualcuno ha bisogno di ottenere l'idea di come risolvere questo bug ...

<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> 

Il numero RecyclerView ora è largo quanto lo spazio disponibile nella scheda madre LinearLayout, che contiene anche un pulsante a destra di RecyclerView e non si verifica alcun arresto anomalo.

Se qualcuno scopre la vera causa di tale eccezione o un modo migliore per risolvere il problema, si prega di condividere ...

8

Ho avuto esattamente lo stesso errore come quello sollevato nella questione e di fatto hanno sollevato un bug con Google per questo. Ho trovato, dopo aver approfondito il codice framework, che avrei potuto risolvere il problema cambiando l'impostazione di HasFixedSize da FALSE a TRUE i.e. "rv.setHasFixedSize (true)". Questo in pratica dice a RecyclerView che le modifiche ai suoi contenuti non cambieranno le dimensioni di RecyclerView evitando così un layout completo. Inizialmente avevo impostato questo FALSO a causa di un'interpretazione errata del suo significato. Questa modifica rimuove il difetto per me ed è una soluzione riproducibile.

+0

hai salvato la mia giornata ... !! grazie mille amico –

+0

'rv.setHasFixedSize (false);' ha fatto il trucco. Grazie! – Meet