RecyclerViewAdapter中Admob插屏广告点击条目不显示问题求助
Admob插屏广告点击RecyclerView条目不展示问题修复方案
核心问题说明
- 广告单元ID配置错误:代码中给插屏广告用了横幅广告的ID(
R.string.admob_banner),会导致广告加载失败 - 未判断广告加载状态:直接调用
show()方法,插屏广告必须加载完成后才能正常展示 - 跳转逻辑时机错误:触发广告后立即跳转Activity,广告还未渲染就被页面切换打断
- 缺少广告事件监听:无法处理广告关闭、加载失败等场景,既不符合Admob政策也会导致功能异常
- 没有预加载下一次广告:插屏广告单次加载只能展示一次,用完后需要重新加载才能供下次点击使用
修改后的完整代码
import com.google.android.gms.ads.AdListener; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.InterstitialAd; public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> { private Context mContext; private List<Anime> mData ; RequestOptions option; private InterstitialAd interstitialAd; // 存储当前点击的条目数据,方便广告关闭后跳转使用 private Anime currentClickAnime; public RecyclerViewAdapter(Context mContext, List<Anime> mData) { // 建议传入Activity上下文,不要用ApplicationContext,避免广告展示异常 this.mContext = mContext; this.mData = mData; // 初始化插屏广告 interstitialAd = new InterstitialAd(mContext); // !!!注意这里要替换为你自己的插屏广告单元ID,不能用横幅广告的ID interstitialAd.setAdUnitId(mContext.getString(R.string.admob_interstitial)); // 加载广告 loadInterstitialAd(); // 设置广告事件监听 interstitialAd.setAdListener(new AdListener() { @Override public void onAdClosed() { // 广告关闭后再跳转页面 gotoWebViewActivity(currentClickAnime); // 广告展示完后重新加载下一次广告,方便下次点击使用 loadInterstitialAd(); } @Override public void onAdFailedToLoad(int i) { // 广告加载失败时无需额外操作,下次触发会重新尝试加载 } }); // Request option for Glide option = new RequestOptions().centerCrop().placeholder(R.drawable.loading_shape).error(R.drawable.loading_shape); } // 封装插屏广告加载逻辑 private void loadInterstitialAd() { if (!interstitialAd.isLoaded() && !interstitialAd.isLoading()) { interstitialAd.loadAd(new AdRequest.Builder().build()); } } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view ; LayoutInflater inflater = LayoutInflater.from(mContext); view = inflater.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) { currentClickAnime = mData.get(viewHolder.getAdapterPosition()); view.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.clcik)); // 先判断广告是否加载完成 if (interstitialAd != null && interstitialAd.isLoaded()) { interstitialAd.show(); } else { // 广告没加载完成的话直接跳转,不要让用户等待 gotoWebViewActivity(currentClickAnime); // 同时尝试加载下一次广告 loadInterstitialAd(); } } }); return viewHolder; } // 封装跳转WebViewActivity逻辑,避免重复代码 private void gotoWebViewActivity(Anime anime) { Intent i = new Intent(mContext, WebViewActivity.class); i.putExtra("action_link",anime.getWebsite_link()); i.putExtra("puzzle_link",anime.getWebsite_link()); i.putExtra("arcade_link",anime.getWebsite_link()); i.putExtra("adventure_link",anime.getWebsite_link()); i.putExtra("sports_link",anime.getWebsite_link()); i.putExtra("racing_link",anime.getWebsite_link()); i.putExtra("zombie_link",anime.getWebsite_link()); mContext.startActivity(i); CustomIntent.customType(mContext,"fadein-to-fadeout"); } @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); } } }
额外注意事项
- 一定要在
strings.xml中新增插屏广告的单元ID配置,替换原来的横幅ID - 插屏广告的展示频率不要过高,否则可能触发Admob的政策限制
- 测试阶段建议使用Admob官方提供的测试ID,避免被判定为无效点击
内容的提问来源于stack exchange,提问作者Litu
相关产品推荐
相关产品推荐

