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

RecyclerView中AdMob原生广告无法插入列表问题排查

RecyclerView列表项间AdMob原生广告不显示问题解决

问题概述

需在RecyclerView列表项之间展示AdMob原生广告,但广告无法显示,列表项与进度条功能正常。经排查,onCreateViewHolder中返回AdHolder的代码从未执行,原因是getItemViewType方法从未返回类型2,导致i==2的条件不触发,无法加载广告布局。

相关代码片段

public RecyclerView.ViewHolder onCreateViewHolder(@NotNull ViewGroup viewGroup, int i) {
    if (i == 1) {
        return new MyViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_template_adapter_list, viewGroup, false));//show list of items
    }
    if (i != 2) {
        return new LoadingHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.progress_view, viewGroup, false));//shows progressbar
    }
    return new AdHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.ad_view, viewGroup, false));//this statement never called for loading native ad
}

public Object getItem(int i) {
    return this.posterDatas.get(i);
}

public int getItemCount() {
    ArrayList<Object> arrayList = this.posterDatas;
    if (arrayList == null) {
        return 0;
    }
    return arrayList.size();
}

@Override
public int getItemViewType(int i) {
    if (this.isLoaderVisible) {
        if (i == this.posterDatas.size() - 1) {
            return 0;
        }
        if (this.posterDatas.get(i) instanceof String) {
            return 2;
        }
        return 1;
    } else if (this.posterDatas.get(i) instanceof String) {
        return 2;
    } else {
        return 1;
    }
}

问题原因分析

从getItemViewType逻辑来看,只有当posterDatas对应位置的元素是String类型时,才会返回类型2。如果广告占位元素未被正确添加到posterDatas,或添加的元素不是String类型,getItemViewType就永远不会返回2,广告布局自然无法加载。

同时,onCreateViewHolder的条件判断存在逻辑隐患:当i既不是1也不是2时,会直接返回LoadingHolder,容易覆盖广告类型的判断,导致广告布局加载分支无法触发。

解决方案

  • 检查广告占位元素的添加逻辑:确保向posterDatas插入广告占位时,添加的是String类型对象(比如用"AD_PLACEHOLDER"标记),且插入位置符合需求(比如每N个列表项插入一个)。
  • 优化onCreateViewHolder条件判断:调整判断顺序,优先检查广告类型,避免逻辑分支覆盖:
    public RecyclerView.ViewHolder onCreateViewHolder(@NotNull ViewGroup viewGroup, int i) {
        if (i == 1) {
            return new MyViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_template_adapter_list, viewGroup, false));
        } else if (i == 2) {
            return new AdHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.ad_view, viewGroup, false));
        } else {
            // 进度条类型(i==0)
            return new LoadingHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.progress_view, viewGroup, false));
        }
    }
    
  • 验证getItemViewType逻辑:添加日志打印每个位置的元素类型和返回的viewType,确认是否有位置返回2:
    @Override
    public int getItemViewType(int i) {
        Object item = posterDatas.get(i);
        int viewType;
        if (this.isLoaderVisible) {
            if (i == this.posterDatas.size() - 1) {
                viewType = 0;
            } else if (item instanceof String) {
                viewType = 2;
            } else {
                viewType = 1;
            }
        } else if (item instanceof String) {
            viewType = 2;
        } else {
            viewType = 1;
        }
        return viewType;
    }
    
    若日志中无返回2的情况,说明广告占位元素未正确添加,需检查数据插入逻辑。
  • 确认广告加载逻辑:确保AdHolder中正确初始化并调用AdMob相关API加载原生广告,完成布局填充。

内容的提问来源于stack exchange,提问作者wide vide tech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:02:42