Search code examples
androidandroid-recyclerviewadmobnative-ads

Admob Native ads crashing when clicked in RecyclerView


I have an activity showing recyclerView along with Native Admob ads. The ads are loading and everything is working perfect but when someone clicks on the ad, the app gets crashed. Also the crash does not happen everytime but around every 5 times out of 10.

Here's the log:

                                                                      Process: aculix.com.rakshabandhan, PID: 16098
                                                                      java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.LinearLayout.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
                                                                          at aculix.com.rakshabandhan.Fragments.OneFragment$2.onItemClick(OneFragment.java:133)
                                                                          at aculix.com.rakshabandhan.RecyclerItemClickListener.onInterceptTouchEvent(RecyclerItemClickListener.java:36)
                                                                          at android.support.v7.widget.RecyclerView.dispatchOnItemTouchIntercept(RecyclerView.java:2628)
                                                                          at android.support.v7.widget.RecyclerView.onInterceptTouchEvent(RecyclerView.java:2674)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2175)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                          at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:416)
                                                                          at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1808)
                                                                          at android.app.Activity.dispatchTouchEvent(Activity.java:3065)
                                                                          at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
                                                                          at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
                                                                          at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:378)
                                                                          at android.view.View.dispatchPointerEvent(View.java:10244)
                                                                          at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4444)
                                                                          at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4312)
                                                                          at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3859)
                                                                          at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3912)
                                                                          at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3878)
                                                                          at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4005)
                                                                          at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3886)
                                                                          at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4062)
                                                                          at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3859)
                                                                          at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3912)
                                                                          at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3878)
                                                                          at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3886)
                                                                          at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3859)
                                                                          at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6253)
                                                                          at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6227)
                                                                          at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6188)
                                                                          at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6356)
                                                                          at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                                                                          at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
                                                                          at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)

Solution

  • I solved the problem. For handling the clicks, I was using another class as shown below.

    public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    private OnItemClickListener mListener;
    
    public interface OnItemClickListener {
        public void onItemClick(View view, int position);
    }
    
    GestureDetector mGestureDetector;
    
    public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
        mListener = listener;
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }
        });
    }
    
    @Override
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
        View childView = view.findChildViewUnder(e.getX(), e.getY());
        if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
            mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        }
        return false;
    }
    
    @Override
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
    }
    
    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    
    }}
    

    And then in the fragment, I was setting up the click listener as below

      recyclerView.addOnItemTouchListener(
                new RecyclerItemClickListener(getContext(), new RecyclerItemClickListener.OnItemClickListener() {
                    @Override public void onItemClick(View view, final int position) {
                        // TODO Handle item click
    
    
    
                    }
                })
        );
    

    Now I am handling the click listener inside the Adapter as shown below and it is working perfectly.

     myViewHolder.rInfo.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
    
                        }
                });