我有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
答案 0 :(得分:1)
最好发布一个示例项目来检查问题。仅基于适配器代码是不够的。
从代码中,简短的回答是广告管理器未正确加载。
答案很长,当使用manager.laodAds()
调用广告管理器时,广告可以完全或部分填充,而检查manager.isLoaded()
是不够的。最佳做法是设置NativeAdsManager.Listener::onAdsLoaded()
以确保正确加载所有广告。它还建议将manager
从适配器移动到活动。
值得注意的是,每个nativeAd仅注册一次registerViewForInteraction(View)
。这是不正确的。由于viewHolder每次都不同,为了让nativeAd正常工作,它必须取消注册视图frist,然后再次注册右视图。
另一个值得注意的地方是,经理从头开始只请求了3个原生广告,而且适配器内的代码仍在调用manager.nextNativeAd()
而不检查有效数字。如果展示位置超过3,这将导致3个广告中的连续循环。这可能不是基于收入考虑的最佳方式。