You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中AdMob插页式广告接入RecyclerView后点击一次失效怎么解决?

AdMob插页广告二次点击无响应问题修复方案

问题根因

  • AdMob插页广告是一次性使用对象,单次展示完成后就会失效,原有代码仅在Adapter初始化时加载了一次广告,首次展示后没有新的广告实例,第二次点击时mInterstitialAd为空,没有对应逻辑执行
  • 未处理广告未加载完成的点击场景,用户点击时如果广告还未加载完成会直接无响应
  • 广告回调设置时机不规范,存在时序异常风险
  • 广告逻辑与列表适配器耦合过重,不符合职责分离规范

修复后代码

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

    private Context mContext;
    private List<Anime> mData ;
    RequestOptions option;
    private InterstitialAd mInterstitialAd;

    public RecyclerViewAdapter(Context mContext, List<Anime> mData) {
        this.mContext = mContext;
        this.mData = mData;
        // 建议将MobileAds初始化移动到Application onCreate中,避免重复初始化
        MobileAds.initialize(mContext, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
            }
        });
        // 初始化时加载首次广告
        loadInterstitialAd();

        // Request option for Glide
        option = new RequestOptions().centerCrop().placeholder(R.drawable.loading_shape).error(R.drawable.loading_shape);
    }

    // 抽离广告加载逻辑,方便后续复用调用
    private void loadInterstitialAd() {
        AdRequest adRequest = new AdRequest.Builder().build();
        InterstitialAd.load(mContext,"ca-app-pub-3940256099942544/1033173712", adRequest, new InterstitialAdLoadCallback() {
            @Override
            public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
                mInterstitialAd = interstitialAd;
            }

            @Override
            public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                mInterstitialAd = null;
            }
        });
    }

    // 抽离跳转逻辑,避免重复代码
    private void gotoWebActivity(int position) {
        Intent i = new Intent(mContext, WebViewActivity.class);
        i.putExtra("action_link",mData.get(position).getWebsite_link());
        i.putExtra("puzzle_link",mData.get(position).getWebsite_link());
        i.putExtra("arcade_link",mData.get(position).getWebsite_link());
        i.putExtra("adventure_link",mData.get(position).getWebsite_link());
        i.putExtra("sports_link",mData.get(position).getWebsite_link());
        i.putExtra("racing_link",mData.get(position).getWebsite_link());
        i.putExtra("zombie_link",mData.get(position).getWebsite_link());
        mContext.startActivity(i);
        CustomIntent.customType(mContext,"fadein-to-fadeout");
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.row_items,parent,false);
        final MyViewHolder viewHolder = new MyViewHolder(view) ;
        viewHolder.view_container.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = viewHolder.getAdapterPosition();
                // 校验位置合法性,避免条目移除后下标越界
                if (position == RecyclerView.NO_POSITION) {
                    return;
                }
                view.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.clcik));
                if (mInterstitialAd != null) {
                    // 先设置回调再展示广告,避免时序问题
                    mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() {
                        @Override
                        public void onAdDismissedFullScreenContent() {
                            super.onAdDismissedFullScreenContent();
                            mInterstitialAd = null;
                            // 广告关闭后重新加载下一次广告
                            loadInterstitialAd();
                            gotoWebActivity(position);
                        }

                        @Override
                        public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
                            super.onAdFailedToShowFullScreenContent(adError);
                            // 广告展示失败也直接跳转,不阻塞用户操作
                            mInterstitialAd = null;
                            loadInterstitialAd();
                            gotoWebActivity(position);
                        }
                    });
                    mInterstitialAd.show((Activity) mContext);
                } else {
                    // 广告未加载完成直接跳转,不影响用户使用
                    gotoWebActivity(position);
                    // 预加载广告,下次点击可使用
                    loadInterstitialAd();
                }
            }
        });
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Glide.with(mContext).load(mData.get(position).getWebsite_logo()).apply(option).into(holder.img_thumbnail);
    }

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

    public static class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView img_thumbnail;
        LinearLayout view_container;
        public MyViewHolder(View itemView) {
            super(itemView);
            view_container = itemView.findViewById(R.id.container);
            img_thumbnail = itemView.findViewById(R.id.thumbnail);
        }
    }
}

额外优化建议

  • 将MobileAds初始化逻辑移动到Application类的onCreate方法中,避免重复初始化
  • 可根据产品需求配置广告展示频率,避免每一次点击都展示广告影响用户体验
  • 上线前记得将测试广告ID替换为正式ID

内容的提问来源于stack exchange,提问作者Litu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:45:06