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

如何在RecyclerView中添加Startapp横幅广告?

StartApp横幅广告在RecyclerView适配器中的实现方案

前置准备

首先完成StartApp SDK的基础集成配置:

  • 在app模块build.gradle中添加StartApp SDK依赖
  • 在自定义Application类的onCreate方法中填入你的应用ID,完成SDK初始化
  • 在AndroidManifest.xml中添加网络、广告相关必要权限

适配器改造逻辑

你提供的代码为RecyclerView列表适配器,要在列表中插入横幅广告,需要调整列表条目逻辑,区分普通内容项和广告项:

  • 定义两种ViewType常量,分别标记普通内容和广告
  • 调整条目计数逻辑,计入插入的广告位数量
  • 重写getItemViewType方法,根据位置返回对应条目类型
  • 分别处理两类条目的创建和数据绑定逻辑

改造后代码示例

// 首先添加两个ViewType常量
private static final int TYPE_NORMAL = 0;
private static final int TYPE_AD = 1;
// 配置广告插入间隔,示例为每5条内容插1条广告
private static final int AD_INTERVAL = 5;

public ParseAdapter(ArrayList<ParseItem> parseItems, Context context) {
    this.parseItems = parseItems;
    this.context = context;
    dialog = new Dialog(context);
}

@Override
public int getItemViewType(int position) {
    // 每隔AD_INTERVAL个条目返回广告类型
    if (position != 0 && position % AD_INTERVAL == 0) {
        return TYPE_AD;
    }
    return TYPE_NORMAL;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    if (viewType == TYPE_AD) {
        // 加载广告条目布局,需提前创建R.layout.item_startapp_banner作为广告容器
        View adView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_startapp_banner, parent, false);
        return new AdViewHolder(adView);
    }
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.parse_item, parent, false);
    return new NormalViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    if (getItemViewType(position) == TYPE_AD) {
        AdViewHolder adHolder = (AdViewHolder) holder;
        // 初始化并加载StartApp横幅广告,可根据需求替换横幅尺寸
        BannerView startAppBanner = new BannerView(context, BannerType.BANNER_320x50);
        adHolder.adContainer.addView(startAppBanner);
        startAppBanner.loadAd();
        return;
    }
    // 普通内容绑定逻辑,换算实际内容位置(减去已插入的广告数量)
    int actualPosition = position - (position / AD_INTERVAL);
    ParseItem parseItem = parseItems.get(actualPosition);
    NormalViewHolder normalHolder = (NormalViewHolder) holder;
    normalHolder.textView.setText(parseItem.getTitle());
    normalHolder.duration.setText(parseItem.getSongTime());
    normalHolder.artist.setText(parseItem.getArtist());
    Glide.with(context).load(parseItem.getImgUrl()).into(normalHolder.imageView);
}

@Override
public int getItemCount() {
    // 总条目数 = 内容条目数 + 广告条目数
    int adCount = parseItems.size() / AD_INTERVAL;
    return parseItems.size() + adCount;
}

// 原有普通内容ViewHolder
class NormalViewHolder extends RecyclerView.ViewHolder {
    TextView textView, duration, artist;
    ImageView imageView;
    public NormalViewHolder(@NonNull View itemView) {
        super(itemView);
        // 替换为你的布局控件对应id
        textView = itemView.findViewById(R.id.title);
        duration = itemView.findViewById(R.id.duration);
        artist = itemView.findViewById(R.id.artist);
        imageView = itemView.findViewById(R.id.cover);
    }
}

// 广告条目ViewHolder
class AdViewHolder extends RecyclerView.ViewHolder {
    LinearLayout adContainer;
    public AdViewHolder(@NonNull View itemView) {
        super(itemView);
        adContainer = itemView.findViewById(R.id.ad_banner_container);
    }
}

注意事项

  • 广告布局R.layout.item_startapp_banner可自行定义,根布局建议用LinearLayout,内部仅需保留id为ad_banner_container的空容器即可,高度适配横幅广告的尺寸
  • 可根据业务需求调整AD_INTERVAL的数值,避免广告插入过密影响用户体验
  • 可自行添加广告加载失败的回调逻辑,加载失败时隐藏广告位避免页面留白
  • 如果你的布局控件id和示例不一致,对应替换即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 06:21:03