Issue with Admob NativeExpressAdView in Recyclerview Implementation

439 views Asked by At

I have already done lot of googling before asking this question here.

I have integrated NativeExpressAdView in my Recyclerview as described here in this google example and it is working fine too. But issue is, in this example project, they are adding NativeExpressAdView from zeroth position, but don't want to add NativeExpressAdView at zeroth position.

I can add at random position too, but issue comes when we have to set the adsize for the NativeExpressAdView from code.

Cardview, which is accessed in MainActivity's setUpAndLoadNativeExpressAds method, will be Null and will give NPE if do not add view at zeroth position.

Here is my modified code snippet

/**
     * Adds Native Express ads to the items list.
     */
    private void addNativeExpressAds() {

        // Loop through the items array and place a new Native Express ad in every ith position in
        // the items List.
        for (int i = 7; i <= mRecyclerViewItems.size(); i += ITEMS_PER_AD) {
            final NativeExpressAdView adView = new NativeExpressAdView(MainActivity.this);
            mRecyclerViewItems.add(i, adView);
        }
    }

    /**
     * Sets up and loads the Native Express ads.
     */
    private void setUpAndLoadNativeExpressAds() {
        // Use a Runnable to ensure that the RecyclerView has been laid out before setting the
        // ad size for the Native Express ad. This allows us to set the Native Express ad's
        // width to match the full width of the RecyclerView.
        mRecyclerView.post(new Runnable() {
            @Override
            public void run() {
                final float scale = MainActivity.this.getResources().getDisplayMetrics().density;
                // Set the ad size and ad unit ID for each Native Express ad in the items list.
                for (int i = 7; i <= mRecyclerViewItems.size(); i += ITEMS_PER_AD) {
                    final NativeExpressAdView adView =
                            (NativeExpressAdView) mRecyclerViewItems.get(i);
                    final CardView cardView = (CardView) findViewById(R.id.ad_card_view);
                    final int adWidth = cardView.getWidth() - cardView.getPaddingLeft()
                            - cardView.getPaddingRight(); //Here cardView will be Null (so NPE).
                    AdSize adSize = new AdSize((int) (adWidth / scale), NATIVE_EXPRESS_AD_HEIGHT);
                    adView.setAdSize(adSize);
                    adView.setAdUnitId(AD_UNIT_ID);
                }

                // Load the first Native Express ad in the items list.
                loadNativeExpressAd(7); //Not added code for this method as nothing is modified in that.
            }
        });
    }

This issue is coming even if i implement same changes after pulling the sample project code from repo.

Here is my logcat crash

    FATAL EXCEPTION: main
java.lang.NullPointerException                                                                                                                           at com.google.android.gms.example.nativeexpressrecyclerviewexample.MainActivity$1.run(MainActivity.java:106)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)

So is this some kind of bug or i m doing something wrong.

1

There are 1 answers

8
jigar savaliya On

just add one more condition that

if (i!=0){}

in the both for loop
update:

  */
private void addNativeExpressAds() {

    // Loop through the items array and place a new Native Express ad in every ith position in
    // the items List.
    for (int i = 0; i <= mRecyclerViewItems.size(); i += ITEMS_PER_AD) {
if(i!=0){
        final NativeExpressAdView adView = new NativeExpressAdView(MainActivity.this);
        mRecyclerViewItems.add(i, adView);
    }}
}

/**
 * Sets up and loads the Native Express ads.
 */
private void setUpAndLoadNativeExpressAds() {
    // Use a Runnable to ensure that the RecyclerView has been laid out before setting the
    // ad size for the Native Express ad. This allows us to set the Native Express ad's
    // width to match the full width of the RecyclerView.
    mRecyclerView.post(new Runnable() {
        @Override
        public void run() {
            final float scale = MainActivity.this.getResources().getDisplayMetrics().density;
            // Set the ad size and ad unit ID for each Native Express ad in the items list.
            for (int i = 0; i <= mRecyclerViewItems.size(); i += ITEMS_PER_AD) {
if(i!=0){
                final NativeExpressAdView adView =
                        (NativeExpressAdView) mRecyclerViewItems.get(i);
                final CardView cardView = (CardView) findViewById(R.id.ad_card_view);
                final int adWidth = cardView.getWidth() - cardView.getPaddingLeft()
                        - cardView.getPaddingRight(); //Here cardView will be Null (so NPE).
                AdSize adSize = new AdSize((int) (adWidth / scale), NATIVE_EXPRESS_AD_HEIGHT);
                adView.setAdSize(adSize);
                adView.setAdUnitId(AD_UNIT_ID);
            }}

            // Load the first Native Express ad in the items list.
            loadNativeExpressAd(ITEMS_PER_AD); //Not added code for this method as nothing is modified in that.
        }
    });
}