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:
若日志中无返回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; } - 确认广告加载逻辑:确保
AdHolder中正确初始化并调用AdMob相关API加载原生广告,完成布局填充。
内容的提问来源于stack exchange,提问作者wide vide tech
相关产品推荐
相关产品推荐

