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

