NullPointerException - Attempt to invoke virtual method RecyclerView$ViewHolder.shouldIgnore()' on a null object reference

匿名 (未验证) 提交于 2019-12-03 01:25:01

问题:

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) 

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

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

回答1:

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:

I found the source of this problem. Within RecyclerView.dispatchLayoutStep3(), there's a for loop, "for (int i = 0; i

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

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) Disable change animation in your RecyclerView

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



回答2:

In my case the error caused because I was setting a new RecyclerView.LayoutParams into the rootview of an item.

Then I realized that RecyclerView item views actually store their ViewHolders in a custom LayoutParams class. So when I reset the LayoutParams ViewHolder reference is gone forever. Which causes a NullPointerException crash later.

The problem is gone after I stopped setting the RecyclerView.LayoutParams into the item rootView. :)

So. Stop doing that in your ViewHolder:

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


回答3:

I met up with this exception just now, and I fixed it by changing framgent to FragmentLayout.

My adapter used some data in fragment argument, and the using fragment in xml does not fill the data, so the bug occurs.

Just post this here, maybe useful to someone.



回答4:

If you absolutely need to modify layout params, you can use the default item layout params like this:

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


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!