6


新しいRecyclerViewでは、高さ(または幅)にwrap_contentを使用できます。だからGoogleはバグを修正しました - https://code.google.com/p/android/issues/detail?id=74772
しかし、すべてが最終的にうまくいくわけではありません。
RecyclerViewからアイテムを削除するときに、dissapearenceのアニメーションを使用しようとしています。 私はアダプタのメソッドを使用します - 任意の引数とnotifyItemRemoved(int)とRecyclerView原因NullPointerException。

XMLコード:サポートからのRecyclerViewのdissapearenceアニメーションのNullPointerException

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



ログ:

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) 



は、たぶん、これらの問題の一時回避策があるのですか?

EDIT
私は新しいプロジェクトで再現してみました。だから例外は投げられなかった。たぶん私のプロジェクトには、この問題を呼び出す他の依存関係があります。

+0

コードを共有できますか? – Ajinkya

+0

私はまったく同じ問題を抱えています。私はそれがサポートライブラリのバグだと思います。私はnotify ...メソッド内のデフォルトのアニメーション以外の方法で私のエントリをアニメーション化していません – mhenryk

+0

問題を再現するサンプルアプリケーションでバグレポートを作成できますか? – yigit

答えて

5

Googleは、サポートライブラリのバージョン23.2でRecyclerViewの使用について何らかの声明を発表しました。ブログ記事へ

リンク(RecyclerViewセクションを確認してください):http://android-developers.blogspot.com.br/2016/02/android-support-library-232.html

この変更により、アイテムビューのレイアウトパラメータをダブルチェックしてください:以前に無視されたレイアウトパラメータを(などでMATCH_PARENTとしてスクロール方向)が完全に尊重されます。

私はmatch_parentにごRecyclerViewのlayout_heightのparamを変更しようとするあなたをお勧めします。それが動作するかどうかお知らせください。

+0

イエス、with match_parent RecyclerViewは例外を起こさない。しかし、私はwrap_contentで必要です。 –

+0

ええ、私はそれについていくつかの議論を読んだことがあります、私はあなたがhttp://b.android.comでバグを記入すべきだと思っています。 –

0

私はまったく同じ例外を持っています。これは、RecyclerViewにビューを追加したときに発生し、そのビューはRecyclerViewの境界を完全に超えています(ユーザーは新しく追加されたビューを表示するためにスクロールする必要があります)。

しかし、私はRecyclerViewの幅または高さがLinearLayout内の1に設定された重みを持つwrap_contentまたは0dpあるとき、私はものを除いて他の値に幅と高さを設定した場合、この例外が唯一の...起こることに気付きました2つ、すなわち140dpmatch_parent、すべて正常に動作します。 0dp、重量:

だから、私はバギーフレームワークをだましとRecyclerView(幅が含まれている私のLinearLayout内部に残った空間があると同じ大きさに私のRecyclerViewの幅を設定するための解決策を見つけるために試してみた1組み合わせは)ので、私は1に設定された重みを持つ別のLinearLayout内部RecyclerViewを包み、match_parentに私のRecyclerViewさんに幅を設定し、それはLinearLayoutが得ることができる親と同じ幅取得し、親LinearLayoutは別の親LinearLayout内の空きスペースを埋めます。とにかく、それは完璧に動作します!誰もがこのバグを回避する方法のアイデアを得るために必要がある場合

私が知っている、それはばかげて聞こえるが、それは私がそれを働いた方法です...

ここではソースコードが...

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

RecyclerViewは、RecyclerViewの右側に1つのボタンも含まれている親のLinearLayoutに空き領域があり、クラッシュは発生しません。

誰もがこのような例外や、それを修正するためのより良い方法の本当の原因を見つけた場合、共有してください...

8

質問に、実際に上げ1が提起しているように私にはまったく同じエラーが発生しましたこのためのGoogleのバグHasFixedSizeの設定をFALSEからTRUE、つまり "rv.setHasFixedSize(true)"に変更することで、フレームワークコードを掘り下げて問題を解決できることがわかりました。これは基本的にRecyclerViewにその内容の変更はRecyclerViewのサイズを変更しないので、完全なレイアウトを避けることを伝えています。もともと、私はこの意味を誤って解釈したためにこの偽を設定していました。この変更により、私の間違いがなくなり、再現可能な解決策になります。

+0

あなたは私の日を救った... !!おかげでたくさんのバディ –

+0

'rv.setHasFixedSize(false);'トリックをしました。ありがとう! – Meet

関連する問題