Android Audience Network Ad不会显示下一个广告

时间:2016-04-06 17:28:40

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

我有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(以及其他元素)没有变化!

希望有人能帮助我。以下是Adapter https://gist.github.com/burnix/c1dd34dd896f5c6ddc6b2b8971908e28

的完整代码

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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