NullPointerException-尝试在空对象引用上调用虚拟方法RecyclerView $ ViewHolder.shouldIgnore()' [英] NullPointerException - Attempt to invoke virtual method RecyclerView$ViewHolder.shouldIgnore()' on a null object reference

查看:350
本文介绍了NullPointerException-尝试在空对象引用上调用虚拟方法RecyclerView $ ViewHolder.shouldIgnore()'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

自从升级到Android支持23.2.0以来,一些开发人员报告看到​​了以下堆栈跟踪:

Several developers have reported seeing the following stack trace since upgrading to Android Support 23.2.0:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.v7.widget.RecyclerView$ViewHolder.shouldIgnore()' on a null object reference
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2913)
    at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1445)
    at android.support.v7.widget.RecyclerView.access$400(RecyclerView.java:144)
    at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:282)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:821)
    at android.view.Choreographer.doCallbacks(Choreographer.java:606)
    at android.view.Choreographer.doFrame(Choreographer.java:575)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:807)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:145)
    at android.app.ActivityThread.main(ActivityThread.java:6895)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

当启用RecyclerView的更改动画并调用相应的RecyclerView.Adapter方法notifyItemInserted(),notifyItemRemoved()等以指示对适配器管理的列表进行了单独更改时,就会发生这种情况(与批量更改,如notifyDataSetChanged()所示.

This occurs when RecyclerView's change animation is enabled and corresponding RecyclerView.Adapter methods notifyItemInserted(), notifyItemRemoved(), etc., are called to indicate that an isolated change was made to the list managed by the adapter (as opposed to a wholesale change, as indicated by notifyDataSetChanged()).

这是由于RecyclerView中的错误还是我们的开发人员做错了什么?

Is this due to a bug in RecyclerView, or are we developers doing something wrong?

推荐答案

这似乎是由于23.2.0中引入的RecyclerView中的错误所致.在此处报告了该错误,我解释了我的想法.导致对该错误进行评论#5 中的错误.

This appears to be due to a bug in RecyclerView, which was introduced in 23.2.0. The bug was reported here, and I explained what I think is causing the error in comment #5 on that bug.

这是我的解释,此处出于历史目的和便于参考而复制在这里:

Here's my explanation, copied here for historical purposes and ease of reference:

我找到了这个问题的根源.内 RecyclerView.dispatchLayoutStep3(),有一个for循环,"for(int i = 0;我<数数; ++ i)",其中计数基于 mChildHelper.getChildCount().在进行此迭代时, 由ChildHelper管理的集合由修改 ChildHelper.hideViewInternal(),导致返回null 从第3050行的对mChildHelper.getChildAt()的调用 RecyclerView,这反过来导致从返回null 在同一行代码(RecyclerView:3050)上的getChildViewHolderInt().

I found the source of this problem. Within RecyclerView.dispatchLayoutStep3(), there's a for loop, "for (int i = 0; i < count; ++i)", where count is based on mChildHelper.getChildCount(). While this iteration is occurring, the collection managed by ChildHelper is modified by ChildHelper.hideViewInternal(), which results in null being returned from the call to mChildHelper.getChildAt() on line 3050 of RecyclerView, which in turn results in null being returned from getChildViewHolderInt() on the same line of code (RecyclerView:3050).

这是导致修改的方法调用链, 破坏了for循环的完整性:

Here's the chain of method calls that results in the modification that breaks the integrity of the for loop:

dispatchLayoutStep3()-> animateChange()-> addAnimatingView()-> hide()-> hideViewInternal()

dispatchLayoutStep3() -> animateChange() -> addAnimatingView() -> hide() -> hideViewInternal()

当ChildHelper将子参数添加到其mHiddenViews集合中时, 它违反了for循环的完整性 dispatchLayoutStep3().

When ChildHelper adds the child param to its mHiddenViews collection, it violates the integrity of the for loop way up in dispatchLayoutStep3().

我看到了两种解决方法:

I see two workarounds for this:

1)在RecyclerView中禁用更改动画

1) Disable change animation in your RecyclerView

2)降级到23.1.1,这不是问题

2) Downgrade to 23.1.1, where this wasn't a problem

这篇关于NullPointerException-尝试在空对象引用上调用虚拟方法RecyclerView $ ViewHolder.shouldIgnore()'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆