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

Android RecyclerView Adapter插入AdMob广告后丢失最后项的解决求助

问题分析

你的核心问题是RecyclerView总条目数计算错误:当前getItemCount()返回原帖子数量(6),但插入广告后总条目数应为「帖子数 + 广告数」,导致RecyclerView仅加载6个条目,其中1个被广告占用,最后一条帖子因此失去显示位置。另外getRealPosition()的索引映射逻辑也需要同步调整,避免数据错位。

修正代码

1. 修正总条目数计算

首先修改getItemCount(),返回包含广告的真实总条目数:

@Override
public int getItemCount() {
    if (LIST_AD_DELTA == 0 || dataset.isEmpty()) {
        return dataset.size();
    }
    // 计算广告数量:每LIST_AD_DELTA条帖子插入1个广告
    int adCount = dataset.size() / LIST_AD_DELTA;
    Log.d("SIZE", "原帖子数:" + dataset.size() + ",总条目数(含广告):" + (dataset.size() + adCount));
    return dataset.size() + adCount;
}

2. 修正真实数据索引映射

调整getRealPosition(),确保数据项能正确对应原dataset的索引:

private int getRealPosition(int position) {
    if (LIST_AD_DELTA == 0) {
        return position;
    }
    // 计算当前位置之前已插入的广告数量
    int adCountBefore = position / (LIST_AD_DELTA + 1);
    return position - adCountBefore;
}

3. 优化广告位置判断(可选)

如果LIST_AD_DELTA是指「每N条帖子后插一个广告」,可以调整getItemViewType(),避免广告出现在列表末尾:

@Override
public int getItemViewType(int position) {
    if (LIST_AD_DELTA == 0) {
        return viewTypeData;
    }
    // 广告位置:每LIST_AD_DELTA条数据后插入,且避开列表最后一个位置
    int adjustedPosition = position - (position / (LIST_AD_DELTA + 1));
    if (adjustedPosition > 0 && adjustedPosition % LIST_AD_DELTA == 0) {
        return AD;
    }
    return viewTypeData;
}
验证逻辑

以你6条帖子、LIST_AD_DELTA=5(插入1次广告)为例:

  • 总条目数 = 6 + 6/5 = 7
  • 广告位置在position5(第5条帖子之后)
  • 数据项position0-4对应原索引0-4,position6对应原索引5(最后一条帖子)
  • 最终实现6条帖子+1个广告的完整展示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:40:42