在RecyclerView Adapter中未实现的抽象方法

时间:2016-08-29 21:14:51

标签: android android-recyclerview recycler-adapter

我在现有正在运行的项目中添加了一些功能,之后我测试了应用程序的完整测试,发现任何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)

2 个答案:

答案 0 :(得分:1)

AbstractMethodError是一个双重异常(包括在编译时被捕获的情况和在运行时被捕获的情况)。此类的Java文档声明“当应用程序尝试调用抽象方法时抛出。”。

抽象方法是没有实现的函数,即它们只有定义的函数签名(a.k.a. header)。因此,当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

答案 1 :(得分:0)

我通过将android support库降级为23.1.1并禁用更改动画来修复它:

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

XML中将以下行添加到RecycleView标记:

     android:animateLayoutChanges="false"

现在,我正在和我合作。