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
相关产品推荐
相关产品推荐

