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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:15:56