0

我有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());

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

希望有人我们会帮助我。这是https://gist.github.com/burnix/c1dd34dd896f5c6ddc6b2b8971908e28的完整代码Adapter

4

1 回答 1

1

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

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

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

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

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

于 2016-04-15T00:11:09.270 回答