Проблема с Admob NativeExpressAdView в реализации Recyclerview

Я уже много гуглил, прежде чем задавать этот вопрос здесь.

Я включил NativeExpressAdView в свой Recyclerview, как описано здесь в этом примере Google, и он тоже работает нормально. Но проблема в том, что в этом примере проекта они добавляют NativeExpressAdView из нулевой позиции, но не хотят добавлять NativeExpressAdView в нулевой позиции.

Я также могу добавлять в произвольном положении, но проблема возникает, когда мы должны установить размер кода для NativeExpressAdView из кода.

Cardview, который доступен в MainActivitysetUpAndLoadNativeExpressAds method, будет Null и даст NPE, если не добавить представление в нулевую позицию.

Вот мой модифицированный фрагмент кода

/**
     * 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.
            }
        });
    }

Эта проблема возникает, даже если я реализую те же изменения после извлечения примера кода проекта из репозитория.

Вот мой сбой logcat

    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)

Так это какая-то ошибка или я делаю что-то не так?

1 ответ

Просто добавьте еще одно условие

if (i!=0){}

в оба цикла
обновление:

  */
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.
        }
    });
}
Другие вопросы по тегам