将Admob原生广告加载到Recyclerview时出现问题

问题描述

我正在尝试在recyclerview中加载admob原生广告。我使用了原生广告模板。我已经在主要活动(onCreate)中初始化了广告。

MobileAds.initialize(this,"ca-app-pub-3940256099942544~3347511713");

这是我的items_ads.xml

<com.google.android.ads.nativetemplates.TemplateView android:id="@+id/my_template"
    app:gnt_template_type="@layout/gnt_small_template_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" />

这是我的适配器类

公共类WallpaperzAdapter扩展了RecyclerView.Adapter {

private final int  CONTENT_TYPE=1;
private final int AD_TYPE=2;

private Activity _activity;
private List<Photo> wallpapersList = new ArrayList<Photo>();
Context context;

public WallpaperzAdapter(Activity activity,List<Photo> wallpapersList) {
    this._activity = activity;
    this.wallpapersList = wallpapersList;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
    if (viewType == AD_TYPE) {
        adViewHolder madViewHolder = new adViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_ads,null,false));
        return madViewHolder;
    } else{
        WallpaperViewHolder mYourViewHolder = new WallpaperViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_wallpaperz,false));
        return mYourViewHolder;
    }
}

@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder,final int position) {
    if (getItemViewType(position) == CONTENT_TYPE) {
    final Photo p = wallpapersList.get(position);

        ((WallpaperViewHolder) holder).thumbNail.setVisibility(View.VISIBLE);

    Glide.with(_activity)
            .load(p.getSrc().getPortrait())
            .thumbnail(0.5f)
            .into(((WallpaperViewHolder) holder).thumbNail);

        ((WallpaperViewHolder) holder).thumbNail.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Log.v("","");

        }
    });

} else if (getItemViewType(position) == AD_TYPE){

        final AdLoader adLoader = new AdLoader.Builder(context,"ca-app-pub-3940256099942544/2247696110")
                .forUnifiedNativeAd(new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() {
                    @Override
                    public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) {
                        // Show the ad.
                        NativeTemplateStyle styles = new
                                NativeTemplateStyle.Builder().build();

                        TemplateView template = ((adViewHolder) holder).Adtemplate;
                        template.setStyles(styles);
                        template.setNativeAd(unifiedNativeAd);

                    }
                })
                .withAdListener(new AdListener() {
                    @Override
                    public void onAdFailedToLoad(int errorCode) {
                        // Handle the failure by logging,altering the UI,and so on.
                    }
                })
                .withNativeAdOptions(new NativeAdOptions.Builder()
                        // Methods in the NativeAdOptions.Builder class can be
                        // used here to specify individual options settings.
                        .build())
                .build();
        adLoader.loadAd(new AdRequest.Builder().build());


    }}

@Override
public int getItemCount() {
    return wallpapersList.size();
}

public class WallpaperViewHolder extends RecyclerView.ViewHolder {

    public ImageView thumbNail;
    final ProgressBar imageloader;

    public WallpaperViewHolder(View itemView) {
        super(itemView);

        // Grid thumbnail image view
        imageloader = itemView.findViewById(R.id.imgLoader);
        thumbNail = itemView
                .findViewById(R.id.home_image_item_view);

    }
}

class adViewHolder extends RecyclerView.ViewHolder {
    TemplateView Adtemplate;

    public adViewHolder(@NonNull View itemView) {
        super(itemView);
        Adtemplate = itemView.findViewById(R.id.my_template);
    }
}

    @Override
public int getItemViewType(int position) {
        if ((position+1) % 5 == 0 && (position+1) != 1) {
            return AD_TYPE;
        }
        return CONTENT_TYPE;
}

}

启动应用程序时,出现以下错误,该错误位于试图为AD_TYPE加载广告的onBindViewHolder中

java.lang.NullPointerException: context cannot be null
        at com.google.android.gms.common.internal.Preconditions.checkNotNull(Unknown Source:11)
        at com.google.android.gms.ads.AdLoader$Builder.<init>(com.google.android.gms:play-services-ads-lite@@19.3.0:2)
        at com.amatyasajal.hdwallpaperz.adapter.WallpaperzAdapter.onBindViewHolder(WallpaperzAdapter.java:104)
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)

请帮助我,这是我第一次与admob合作,我很困惑。预先感谢。

解决方法

嘿,在您的代码中,上下文确实为空,您必须先在承包商中对其进行初始化,或者只使用 _activity 它将起作用并让我知道

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...