RecyclerView结合AdMob仅显示测试广告,数据无法展示求助
问题分析与解决方案
看起来你遇到的核心问题是数据字段绑定失败以及广告插入逻辑错误,导致只显示广告而不展示数据。我帮你梳理几个关键问题并给出修复方案:
1. Model类变量名不匹配(导致name字段无法正确获取)
你的modelNilai类里,序列化字段与get/set方法的变量名不匹配,同时缺少数据项和广告项的区分标记:
public class modelNilai { @Expose @SerializedName("id") private int id_nilai; @Expose @SerializedName("name") private String name; // 新增标记字段,区分数据项/广告项 private boolean isAd = false; // 修复getId/setId的变量名引用 public int getId() { return id_nilai; } public void setId(int id) { this.id_nilai = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } // 新增广告标记的get/set方法 public boolean isAd() { return isAd; } public void setAd(boolean ad) { isAd = ad; } }
2. MainActivity中广告插入逻辑错误
你现在的代码是先创建Adapter再修改数据列表,会导致Adapter无法感知到后续的广告插入;同时循环索引逻辑也会引发索引越界问题:
@Override public void onGetNilai(List<modelNilai> scores) { // 先插入广告,再创建Adapter // 从第3条数据后开始插入,每次间隔4个位置(3条数据+1条广告) for (int i = 3; i < scores.size(); i += 4) { modelNilai adItem = new modelNilai(); adItem.setAd(true); // 标记为广告项 scores.add(i, adItem); } // 现在再初始化Adapter并绑定到RecyclerView adapter = new RecyclerViewAdopter(Nilai.this, scores); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setAdapter(adapter); score = scores; }
3. Adapter中ItemType判断与数据绑定修复
原来的getItemViewType直接使用业务id会导致类型判断混乱,需要改用我们新增的isAd标记来区分:
public class RecyclerViewAdopter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ private static final int TYPE_DATA = 1; private static final int TYPE_AD = 2; private Context mContext; private List<modelNilai> mList; public RecyclerViewAdopter(Context mContext, List<modelNilai> mList) { this.mList = mList; this.mContext = mContext; } // 保持MyViewHolder和ViewHolderAdMob的定义不变 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); if(viewType == TYPE_DATA){ View v = inflater.inflate(R.layout.list_nilai_ad, parent, false); return new MyViewHolder(v); } else { View v = inflater.inflate(R.layout.banner_ad_row, parent, false); return new ViewHolderAdMob(v); } } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { modelNilai model = mList.get(position); if(holder.getItemViewType() == TYPE_DATA){ MyViewHolder viewHolder = (MyViewHolder) holder; // 增加非空判断避免空指针 if(model.getName() != null){ viewHolder.name.setText(model.getName()); } } // 广告项无需额外绑定逻辑 } @Override public int getItemViewType(int position) { // 根据标记返回对应类型 return mList.get(position).isAd() ? TYPE_AD : TYPE_DATA; } @Override public int getItemCount() { return mList.size(); } }
4. 额外检查项
- 确认
list_nilai_ad布局中存在R.id.namaSoal这个TextView,且布局结构正常。 - 在Retrofit的
onResponse中打印日志,确认接口返回的name字段不为空:Log.d("NilaiData", response.body().toString())。 - 确保AdMob的测试设备ID配置正确,避免影响广告加载。
这样修改后,就能实现每3条数据后插入一条广告的预期效果了。
内容的提问来源于stack exchange,提问作者Rendi Chs
相关产品推荐
相关产品推荐

