【问题标题】:Android Audience Network Ad doesn't show next AdAndroid Audience Network 广告不显示下一个广告
【发布时间】:2016-04-06 17:28:39
【问题描述】:

我有RecyclerView,其中每 14 个项目是一个 Facebook Audience Network Ad

@Override
public int getItemViewType(int position) {
    int viewType = 0;
    if (position % 14 == 0 && position != 0) viewType = 2;
    return viewType;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    switch (viewType) {
        case 0:
            return  new MainViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false));
        case 2:
            return new AdHolder((LayoutInflater.from(parent.getContext()).inflate(R.layout.ad_test3, parent, false)));
    }
    return null;
}

如下:每14个元素都是相同的。这是onBindViewHolder 方法。

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
    final FoodData foodData = foodDataList.get(position);

    switch (holder.getItemViewType()) {
        case 0:
            MainViewHolder mainViewHolder = (MainViewHolder) holder;
            ...
            break;
        case 2:
            AdHolder adHolder = (AdHolder) holder;
            //System.out.println("ad hasH" + position);
            if (manager.isLoaded()) {
                NativeAd nativeAd;
                if (map.containsKey(position)) {
                    nativeAd = map.get(position);
                } else {
                    nativeAd = manager.nextNativeAd();
                    map.put(position, nativeAd);
                }

                System.out.println(" Native Ad" + nativeAd.hashCode());
                System.out.println(" Native Ad.Title" + nativeAd.getAdTitle());

                adHolder.templateContainer.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Config.AD_HEIGHT_DP));
                adHolder.nativeAdSocialContext.setText(nativeAd.getAdSocialContext());
                adHolder.nativeAdCallToAction.setText(nativeAd.getAdCallToAction());
                adHolder.nativeAdTitle.setText(nativeAd.getAdTitle());
                adHolder.nativeAdBody.setText(nativeAd.getAdBody());

                Picasso.with(context)
                        .load(nativeAd.getAdIcon().getUrl())
                        .tag("resume_tag")
                        .into(adHolder.nativeAdIcon);

                Picasso.with(context)
                        .load(nativeAd.getAdCoverImage().getUrl())
                        .resize(width, ad_height)
                        .tag("resume_tag")
                        .placeholder(R.drawable.adholder2)
                        .into(adHolder.nativeAdMedia);

                System.out.println("url =" + nativeAd.getAdCoverImage().getUrl());

                if (adHolder.adChoicesView == null) {
                    adHolder.adChoicesView = new AdChoicesView(context, nativeAd, true);
                    adHolder.adChoiceContainer.addView(adHolder.adChoicesView, 0);
                }
                nativeAd.registerViewForInteraction(holder.itemView);
            } else {
                adHolder.params = adHolder.templateContainer.getLayoutParams();
                adHolder.templateContainer.setLayoutParams(new ViewGroup.LayoutParams(0, 0));
            }
            break;
    }

}

我无法理解的是,当我检查相同的 NativeAd object 的位置时:

 System.out.println(" Native Ad" + nativeAd.hashCode());
 System.out.println(" Native Ad.Title" + nativeAd.getAdTitle());

我发现,NativeAd 的 hashCode 发生了变化,但 title(和其他元素)没有变化!

希望有人能帮助我。这是Adapterhttps://gist.github.com/burnix/c1dd34dd896f5c6ddc6b2b8971908e28的完整代码

【问题讨论】:

    标签: android android-recyclerview facebook-audience-network


    【解决方案1】:

    最好发布一个示例项目来检查问题。仅基于适配器代码是不够的。

    从代码来看,简短的回答是广告管理器未正确加载。

    长答案是当使用manager.laodAds() 调用广告管理器时,广告可以全部或部分填充,而仅检查manager.isLoaded() 是不够的。最佳做法是设置NativeAdsManager.Listener::onAdsLoaded() 以确保正确加载所有广告。还建议将manager 从适配器移动到活动。

    值得注意的是每个nativeAd 只注册一次registerViewForInteraction(View)。这是不正确的。由于 viewHolder 每次都会不同,为了让 nativeAd 正常工作,它必须先取消注册视图,然后再重新注册以获得正确的视图。

    另一个值得注意的点是,经理从一开始只请求了 3 个原生广告,并且适配器内的代码一直在调用 manager.nextNativeAd() 而不检查有效号码。如果展示位置超过 3 个,这将导致 3 个广告中的连续循环。这可能不是基于收入考虑的最佳方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多