2016-08-29 8 views
2

既存の実行中のプロジェクトにいくつかの機能を追加し、その後でアプリケーションの完全テストをテストして、変更を加えてアダプタに通知した後にRecyclerViewがクラッシュすることを確認しました。 )。抽象メソッドがRecyclerViewアダプタに実装されていない

私はnotifyDataSetChanged()を使用していますが、notifyItemRemoved()notifyItemInserted()を使用しようとしましたが、まだ問題が発生しています。

私のGradleファイル:

android { 
     compileSdkVersion 23 
     buildToolsVersion '23.0.3' 

     defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
     } 
     buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
     } 
    } 

    dependencies { 
     compile fileTree(dir: 'libs', include: ['*.jar']) 
     compile 'com.android.support:appcompat-v7:23.2.0' 
     compile 'com.android.support:cardview-v7:23.2.0' 
     compile 'com.android.support:recyclerview-v7:23.2.0' 
     compile 'com.android.support:design:23.2.0' 
     ....... 
     ....... 

ログ:

08-29 09:48:21.874: W/dalvikvm(4290): threadid=1: thread exiting with uncaught exception (group=0xb2d29b20) 
08-29 09:48:21.874: W/System.err(4290): java.lang.AbstractMethodError: abstract method not implemented 
08-29 09:48:21.884: W/System.err(4290):  at android.support.v7.widget.RecyclerView$ItemAnimator.animateDisappearance(RecyclerView.java) 
08-29 09:48:21.884: W/System.err(4290):  at android.support.v7.widget.RecyclerView.animateDisappearance(RecyclerView.java:3252) 
08-29 09:48:21.884: W/System.err(4290):  at android.support.v7.widget.RecyclerView.access$700(RecyclerView.java:147) 
08-29 09:48:21.884: W/System.err(4290):  at android.support.v7.widget.RecyclerView$4.processDisappeared(RecyclerView.java:431) 
08-29 09:48:21.884: W/System.err(4290):  at android.support.v7.widget.ViewInfoStore.process(ViewInfoStore.java:246) 
08-29 09:48:21.884: W/System.err(4290):  at android.support.v7.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:3098) 
08-29 09:48:21.884: W/System.err(4290):  at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2917) 
08-29 09:48:21.884: W/System.err(4290):  at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283) 
08-29 09:48:21.884: W/System.err(4290):  at android.view.View.layout(View.java:14817) 
08-29 09:48:21.884: W/System.err(4290):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-29 09:48:21.884: W/System.err(4290):  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055) 
08-29 09:48:21.884: W/System.err(4290):  at android.view.View.layout(View.java:14817) 
08-29 09:48:21.884: W/System.err(4290):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-29 09:48:21.884: W/System.err(4290):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) 
08-29 09:48:21.884: W/System.err(4290):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) 
08-29 09:48:21.884: W/System.err(4290):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
08-29 09:48:21.884: W/System.err(4290):  at android.view.View.layout(View.java:14817) 
08-29 09:48:21.884: W/System.err(4290):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-29 09:48:21.884: W/System.err(4290):  at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:122) 
08-29 09:48:21.884: W/System.err(4290):  at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42) 
08-29 09:48:21.884: W/System.err(4290):  at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1170) 
08-29 09:48:21.894: W/System.err(4290):  at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:814) 
08-29 09:48:21.894: W/System.err(4290):  at android.view.View.layout(View.java:14817) 
08-29 09:48:21.894: W/System.err(4290):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-29 09:48:21.894: W/System.err(4290):  at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1191) 
08-29 09:48:21.894: W/System.err(4290):  at android.view.View.layout(View.java:14817) 
08-29 09:48:21.894: W/System.err(4290):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-29 09:48:21.894: W/System.err(4290):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
08-29 09:48:21.894: W/System.err(4290):  at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
08-29 09:48:21.894: W/System.err(4290):  at android.view.View.layout(View.java:14817) 
08-29 09:48:21.894: W/System.err(4290):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-29 09:48:21.894: W/System.err(4290):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) 
08-29 09:48:21.894: W/System.err(4290):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) 
08-29 09:48:21.894: W/System.err(4290):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
08-29 09:48:21.894: W/System.err(4290):  at android.view.View.layout(View.java:14817) 
08-29 09:48:21.894: W/System.err(4290):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-29 09:48:21.894: W/System.err(4290):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
08-29 09:48:21.894: W/System.err(4290):  at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.View.layout(View.java:14817) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-29 09:48:21.904: W/System.err(4290):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) 
08-29 09:48:21.904: W/System.err(4290):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) 
08-29 09:48:21.904: W/System.err(4290):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.View.layout(View.java:14817) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-29 09:48:21.904: W/System.err(4290):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
08-29 09:48:21.904: W/System.err(4290):  at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.View.layout(View.java:14817) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.Choreographer.doFrame(Choreographer.java:544) 
08-29 09:48:21.904: W/System.err(4290):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
08-29 09:48:21.904: W/System.err(4290):  at android.os.Handler.handleCallback(Handler.java:733) 
08-29 09:48:21.904: W/System.err(4290):  at android.os.Handler.dispatchMessage(Handler.java:95) 
08-29 09:48:21.904: W/System.err(4290):  at android.os.Looper.loop(Looper.java:136) 
08-29 09:48:21.904: W/System.err(4290):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
08-29 09:48:21.904: W/System.err(4290):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-29 09:48:21.904: W/System.err(4290):  at java.lang.reflect.Method.invoke(Method.java:515) 
08-29 09:48:21.904: W/System.err(4290):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
08-29 09:48:21.904: W/System.err(4290):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
08-29 09:48:21.904: W/System.err(4290):  at dalvik.system.NativeStart.main(Native Method) 
+0

あなたが変更したrecyclerviewまたはコードの一部を入れてください。 – Amir

答えて

0

は私がダウングレードによってそれを固定23.1.1からandroid supportライブラリと無効に変更アニメーション:

compile 'com.android.support:appcompat-v7:23.1.1' 
compile 'com.android.support:cardview-v7:23.1.1' 
compile 'com.android.support:recyclerview-v7:23.1.1' 
compile 'com.android.support:design:23.1.1' 

とでアクティビティクラス:

 //Added the following line just for case 
     recyclerView.setHasFixedSize(false); 
     //REMOVE the following line 
     recyclerView.setItemAnimator(animator); 

RecycleViewタグに次の行を追加します。

 android:animateLayoutChanges="false" 

そしてeveythingは今、私と一緒に正常に動作しています。

0

AbstractMethodErrorは、2つの例外です(コンパイル時にキャッチされ、実行時にキャッチされる)。そして、このクラスのJavaドキュメントは、 "アプリケーションが抽象メソッドを呼び出そうとしたときにスローされます。"

抽象メソッドは、実装されていない関数です。つまり、関数シグネチャ(a.k.aヘッダー)のみが定義されています。したがって、JVMが抽象メソッドのエントリーポイントにジャンプするとき、何をすべきか分からないので(関数定義はまだ空です)、この例外がスローされます。したがって、拡張しているクラスで定義されているすべての抽象関数を、実装を持つ実際の関数でオーバーライドする必要があります。具体的にはRecyclerViewは、アダプタのコレクションから項目を削除するときに抽象関数animateDissapearanceを呼び出し、アイテムをそのアダプタのコレクションに追加するときに抽象関数animateAppearanceを呼び出します。 RecyclerViewクラスでこれらの関数をオーバーライドしているようではありません。

例外に対する修正は、前の段落で終了します。これは、あなたが何もせず例外を発生させても抽象メソッドを使用するのはなぜだろうかと疑問に思っている場合です。

抽象メソッド(主にライブラリや他の開発ツールで使用されています)は、開発者が実際の実装を心配することなく任意の複雑な作業単位を参照、スケジュール、および操作することを可能にします。これは、ユーザーが使用するケースがわからないため、ライブラリを開発するときに特に便利です。

独立した開発者が開発したプラグインをサポートしたいツールを開発しているとします。より明確な例を得るためには、それを電子メールクライアントにしてください。ここでは、電子メールクライアントが電子メールを送信するときの状況を見ていきます。デベロッパーコミュニティが、電子メールのコピーをハードドライブ、クラウドストレージ、または送信前にメールに関連するその他のアクションにバックアップするプラグインを開発することを期待しているとします。あなたは何をしているのか分からないが、入力として必要なものを知っていて、それを期待している。だから、このようなあなたのメール送信機能を実装します。

boolean sendMail(HashMap<String, String> headers, String body, String recipient, List<DeveloperPlugin> activePlugins) { 
    //Your parameter validation 
    for(DeveloperPlugin plugin : activePlugins) { 
     plugin.runBeforeSendEmailAction(headers, body); 
    } 
    //Send email 
} 

その後、あなたの開発者コミュニティに指示DeveloperPluginクラス(またはDeveloperPluginインタフェースを実装)を拡張したクラス内のすべての彼らのロジックを格納し、具体的に関連するすべての彼らの行動を実装しますそのクラス(インターフェイス)のrunBeforeSendEmailAction(HashMap<String, String> headers, String body)の機能の中で、実際にメールが送信される前に実行したいメールを指定します。これは、メインモジュール開発者が直面する最大の問題、つまりプラグイン開発者が実装しているアプリケーションの動作を保証する方法を解決します。また、プラグイン開発者が直面する最大の問題を解決します。私の機能がどのようなインプットになるのか、どのようにいつ呼び出されるのかを私はどのように知っていますか?

私はかなりこれに船外に行ったが、うまくいけば誰かがそれが面白いと思うかもしれないが、役に立つかもしれない。

乾杯! :D

関連する問題