Android Studio中RecyclerView嵌入Admob原生广告显示不全求助
问题解决:RecyclerView插入AdMob原生广告后部分Item丢失
你的问题出在广告位判断逻辑、总数量计算、内容位置映射这三个核心点上,导致内容Item被错误替换成广告,最终部分内容无法显示。以下是修正后的完整代码和关键说明:
关键错误分析
- 广告位判断错误:原代码
(position + 1) % ITEM_FEED_COUNT == 0会把第6、12个内容Item(0-based的position5、11)错误标记为广告位,直接覆盖了原本的内容Item。 - 总数量计算错误:
Math.round(mList.size() / ITEM_FEED_COUNT)在内容数量不足6时会错误添加广告位(比如5个内容会算出1个广告位,总数量变成6,多了一个空广告)。 - 内容位置映射错误:
Math.round(position / ITEM_FEED_COUNT)的浮点取整逻辑会导致部分内容位置计算偏差,造成数据显示错乱。
修正后的完整代码
private static int VIEW_TYPE_CONTENT = 0; private static int VIEW_TYPE_AD = 1; private static int ITEM_FEED_COUNT = 6; // 每6个内容后插1个广告 @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view; if (viewType == VIEW_TYPE_CONTENT) { view = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false); return new MyViewHolder(view); } else if (viewType == VIEW_TYPE_AD) { view = LayoutInflater.from(mContext).inflate(R.layout.native_ads, parent, false); return new HolderNativeAds(view); } return null; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder.getItemViewType() == VIEW_TYPE_CONTENT) { // 计算真实的内容列表位置:每(6+1)个位置包含1个广告,用整数除法减去广告数量 int realContentPos = position - (position / (ITEM_FEED_COUNT + 1)); // 这里用realContentPos获取mList中的数据并绑定 // 示例:YourModel model = mList.get(realContentPos); } else if (holder.getItemViewType() == VIEW_TYPE_AD) { // 加载并显示AdMob原生广告 // 示例:loadNativeAd((HolderNativeAds) holder); } } @Override public int getItemCount() { if (mList.size() == 0) return 0; // 总数量 = 内容数量 + 广告数量(广告数量为内容数量除以6的整数结果) return mList.size() + (mList.size() / ITEM_FEED_COUNT); } @Override public int getItemViewType(int position) { // 广告位的位置:每(6+1)个位置的最后一个是广告(0-based的position为6、13、20...) return ((position + 1) % (ITEM_FEED_COUNT + 1) == 0) ? VIEW_TYPE_AD : VIEW_TYPE_CONTENT; }
修正逻辑说明
- 广告位判断:用
(ITEM_FEED_COUNT + 1)作为周期,每7个位置(6内容+1广告)的最后一个位置设为广告位,确保内容Item不会被覆盖。 - 总数量计算:用整数除法
mList.size() / ITEM_FEED_COUNT计算广告数量,比如13个内容会生成2个广告,总数量为15,刚好容纳所有内容和广告。 - 内容位置映射:用
position - (position / (ITEM_FEED_COUNT + 1))计算真实内容位置,整数除法确保每经过一个广告位,就减去对应的偏移量,保证数据映射准确。
以13个内容Item为例:
- 总列表位置0-5:内容Item(对应mList的0-5)
- 位置6:广告
- 位置7-12:内容Item(对应mList的6-11)
- 位置13:广告
- 位置14:内容Item(对应mList的12)
这样所有13个内容Item和2个广告都会完整显示,不会出现内容丢失的问题。
内容的提问来源于stack exchange,提问作者Jibrin Onanefe Israel
相关产品推荐
相关产品推荐

