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

GridView集成Admob广告时横幅消失,需每10数据项显示1个AdView

Hey,我来帮你搞定GridView里插AdView的问题!你之前用uni_listview_ads.xml布局没成功还碰到广告消失的坑,咱们换个思路从Adapter入手,这才是靠谱的实现方式:

实现GridView每10项插入AdView的解决方案

1. 先明确Item类型区分

首先得让Adapter知道,我们有普通数据项和广告项两种布局,这样GridView才能正确渲染对应的内容。

2. 改造你的Adapter核心逻辑

假设你的基础数据列表是List<YourDataModel> dataList,我们一步步修改Adapter:

2.1 定义类型常量

先给两种Item类型起个标识:

private static final int TYPE_ITEM = 0; // 普通数据项
private static final int TYPE_AD = 1;   // 广告项

2.2 告诉GridView当前位置的Item类型

重写getItemViewType方法,每10个数据项后插入一个广告(比如第11、22、33位就是广告):

@Override
public int getItemViewType(int position) {
    // 这里用(position + 1)取模11,是因为第11个位置(索引10)是第一个广告,position+1=11时取模为0
    if ((position + 1) % 11 == 0) {
        return TYPE_AD;
    }
    return TYPE_ITEM;
}

2.3 计算总Item数量

总数量要加上广告的数量,36条数据的话就是36 + 3 = 39:

@Override
public int getCount() {
    // 广告数量 = 数据总数 / 10,整数除法自动取整
    int adCount = dataList.size() / 10;
    return dataList.size() + adCount;
}

2.4 修正数据获取逻辑(可选但建议)

当需要获取对应位置的数据时,要跳过已经插入的广告位置:

@Override
public Object getItem(int position) {
    // 计算当前位置之前已经插入了多少个广告
    int adCountBefore = position / 11;
    // 用当前位置减去广告数量,得到原始数据列表的索引
    return dataList.get(position - adCountBefore);
}

2.5 在getView中加载对应布局

这里是关键,要根据类型加载不同布局,同时解决广告消失的问题:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    int viewType = getItemViewType(position);
    
    if (viewType == TYPE_ITEM) {
        // 加载普通数据项的布局,和你之前的逻辑保持一致
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.your_normal_item_layout, parent, false);
        }
        // 绑定数据到普通Item
        YourDataModel data = (YourDataModel) getItem(position);
        // ... 这里写你的数据绑定逻辑,比如设置文本、图片等
    } else {
        // 加载广告项布局
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.uni_listview_ads, parent, false);
            // 初始化AdView,确保布局里的AdView id和这里对应
            AdView adView = convertView.findViewById(R.id.ad_view);
            AdRequest adRequest = new AdRequest.Builder().build();
            adView.loadAd(adRequest);
        }
        // 重点:广告项不要重新加载!复用已有的convertView,避免滑动时广告消失或重复请求
    }
    return convertView;
}

3. 解决广告消失的核心要点

你之前碰到广告消失,大概率是Adapter的复用机制导致的,记住这几点:

  • 广告项的convertView一旦初始化完成,就不要再重新创建或重新加载广告,否则滑动时会重复请求广告,还可能导致广告被销毁消失
  • 检查uni_listview_ads.xml里的AdView配置,比如尺寸、广告ID是否正确有效
  • 确保AdMob已经在Application中完成初始化,这是广告能正常加载的前提

4. 验证逻辑

拿你说的36条数据举例:

  • 第11、22、33位(索引10、21、32)会显示广告,正好3个,符合你的需求
  • 滑动时广告不会因为复用而消失,因为只有第一次创建时才会请求加载广告

如果用Kotlin开发,逻辑完全一致,只是语法上做对应调整就行~

内容的提问来源于stack exchange,提问作者Modgo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:36:07