2016-03-04 45 views
7

有一些开发人员报告说,看到下面的堆栈跟踪调用虚方法RecyclerView $ ViewHolder.shouldIgnore()”,因为升级到Android支持23.2.0:NullPointerException异常 - 尝试在空对象引用

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())。

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

+1

所报告的问题已被固定在未来支持图书馆。如果您在将来的支持库中再次遇到此问题,请通过提供包含示例应用程序在内的所有必要信息来提出新问题来通知我们。如果问题仍然存在,请通过Google问题跟踪器进行举报,然后重新审核。 https://issuetracker.google.com/issues/37078411 –

回答

2

这似乎是由于23.2.0中引入的RecyclerView中的一个错误。该错误报告为here,我解释了我认为导致该错误的错误comment #5

这里是我的解释,这里复制为参考历史的目的和易用性:

我发现这个问题的根源。在 RecyclerView.dispatchLayoutStep3()中,有一个for循环,“for(int i = 0; i < count; ++ i)”,其中计数基于 mChildHelper.getChildCount()。虽然此迭代正在发生,但由ChildHelper管理的 集合被修改为 ChildHelper.hideViewInternal(),结果为返回null返回 从调用到 RecyclerView的第3050行的mChildHelper.getChildAt(),后者又导致null在同一行代码(RecyclerView:3050)上从 getChildViewHolderInt()返回。

这里的方法的调用链的结果在修饰 中断的for循环的完整性:

dispatchLayoutStep3() - )> animateChange( - > addAnimatingView() - > 隐藏() - > hideViewInternal()

当ChildHelper增加孩子参数去其mHiddenViews收集, 它违反的for循环的完整性 dispatchLayoutStep3一路()。

我看到这两种解决方法:

1)在你的RecyclerView

2)降级到23.1.1,其中这不是一个问题

+0

感谢您的信息,这个错误似乎是在23.2.1固定(至少现在对我来说) –

+2

我在24.2.1版本中面临这个问题。我正在尝试以编程方式添加scrollerview。 –

+1

25.0.0与setHasStableIds(true) – iscariot

0

我遇到了禁止改变动画刚才这个例外,我通过将framgent更改为FragmentLayout来修复它。

我的适配器在片段参数中使用了一些数据,而在xml中使用fragment没有填充数据,所以发生了这个错误。

只要在此发布,也许对某人有用。

2

在我的情况下,错误是因为我设置了新的RecyclerView。LayoutParams进入项目的rootview

然后我意识到RecyclerView项目视图实际上将他们的ViewHolders存储在一个自定义的LayoutParams类中。 因此,当我重置LayoutParams ViewHolder引用永远消失。之后会导致NullPointerException崩溃。

我停止将RecyclerView.LayoutParams设置为项目rootView后,问题消失了。 :)

所以。停止做,在你的ViewHolder:

RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
itemRoot.setLayoutParams(params); 
0

如果您确实需要修改设计参数,可以你可以使用默认的项目布局PARAMS这样的:

ViewGroup.LayoutParams params = itemView.getLayoutParams(); 
    params.height=xx; 
    params.width= xx; 
    params.yyyy = xxx; 
    itemView.setLayoutParams(params); 
相关问题