[英]Change index of Facebook native ads in recyclerview
I am using Facebook native ads in recycleview and it is working perfectly fine.我在 recycleview 中使用 Facebook 原生广告,它运行良好。 But the problem i am facing is that when the ads show up in my recycleview the ads start from the position of 0. I would like to show them lets say after every five items starting from the 6th position.但我面临的问题是,当广告出现在我的回收视图中时,广告从 0 的 position 开始。我想向他们展示,让他们说,从第 6 个 position 开始,每五个项目之后。 Can any one help here is my code.任何人都可以在这里帮助是我的代码。
Activity活动
public class FacebookNativeAds extends AppCompatActivity {
private NativeAdsManager mNativeAdsManager;
NativeAdRecyclerAdapter adapter;
private final String NATIVE_PLACEMENT_ID = "XXXXXXXXXXXXXXXXXXXXXXXX";
private static final String TAG = "FacebookNativeAds";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_facebook_native_ads);
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
AudienceNetworkAds.initialize(this);
AppDatabase database = AppDatabase.getDatabase(this);
Dao dao = database.dao();
mNativeAdsManager = new NativeAdsManager(this, NATIVE_PLACEMENT_ID, 5);
mNativeAdsManager.loadAds();
mNativeAdsManager.setListener(new NativeAdsManager.Listener() {
@Override
public void onAdsLoaded() {
Log.d(TAG, "onAdsLoaded: ");
adapter.notifyDataSetChanged();
Toast.makeText(FacebookNativeAds.this, "onAdsLoaded", Toast.LENGTH_SHORT).show();
}
@Override
public void onAdError(AdError adError) {
Log.d(TAG, "onAdError: ");
Toast.makeText(FacebookNativeAds.this, ""+ adError.getErrorMessage(), Toast.LENGTH_SHORT).show();
}
});
RecyclerView recyclerView = findViewById(R.id.quote_recyclerview2);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
adapter = new NativeAdRecyclerAdapter(this, dao.getData, mNativeAdsManager);
recyclerView.setAdapter(adapter);
}
and here is my adapter.这是我的适配器。
public class NativeAdRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<Item> mPostItems;
private List<NativeAd> mAdItems;
private NativeAdsManager mNativeAdsManager;
private Activity mActivity;
private static final int AD_DISPLAY_FREQUENCY = 5;
private static final int POST_TYPE = 0;
private static final int AD_TYPE = 1;
public NativeAdRecyclerAdapter(
Activity activity, List<Item> postItems, NativeAdsManager nativeAdsManager) {
mNativeAdsManager = nativeAdsManager;
mPostItems = postItems;
mAdItems = new ArrayList<>();
mActivity = activity;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == AD_TYPE) {
NativeAdLayout inflatedView =
(NativeAdLayout)
LayoutInflater.from(parent.getContext())
.inflate(R.layout.native_ad_layout, parent, false);
return new AdHolder(inflatedView);
} else {
View inflatedView =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new PostHolder(inflatedView);
}
}
@Override
public int getItemViewType(int position) {
return position % AD_DISPLAY_FREQUENCY == 0 ? AD_TYPE : POST_TYPE;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder.getItemViewType() == AD_TYPE) {
NativeAd ad;
if (mAdItems.size() > position / AD_DISPLAY_FREQUENCY) {
ad = mAdItems.get(position / AD_DISPLAY_FREQUENCY);
} else {
ad = mNativeAdsManager.nextNativeAd();
if (ad != null) {
if (!ad.isAdInvalidated()) {
mAdItems.add(ad);
} else {
Log.w(NativeAdRecyclerAdapter.class.getSimpleName(), "Ad is invalidated!");
}
}
}
AdHolder adHolder = (AdHolder) holder;
adHolder.adChoicesContainer.removeAllViews();
if (ad != null) {
adHolder.layoutContainer.setVisibility(View.VISIBLE);
adHolder.tvAdTitle.setText(ad.getAdvertiserName());
adHolder.tvAdBody.setText(ad.getAdBodyText());
adHolder.tvAdSocialContext.setText(ad.getAdSocialContext());
adHolder.tvAdSponsoredLabel.setText(ad.getSponsoredTranslation());
adHolder.btnAdCallToAction.setText(ad.getAdCallToAction());
adHolder.btnAdCallToAction.setVisibility(
ad.hasCallToAction() ? View.VISIBLE : View.INVISIBLE);
AdOptionsView adOptionsView = new AdOptionsView(mActivity, ad, adHolder.nativeAdLayout);
adHolder.adChoicesContainer.addView(adOptionsView, 0);
List<View> clickableViews = new ArrayList<>();
clickableViews.add(adHolder.ivAdIcon);
clickableViews.add(adHolder.mvAdMedia);
clickableViews.add(adHolder.btnAdCallToAction);
ad.registerViewForInteraction(
adHolder.nativeAdLayout, adHolder.mvAdMedia, adHolder.ivAdIcon, clickableViews);
}
} else {
PostHolder postHolder = (PostHolder) holder;
// Calculate where the next postItem index is by subtracting ads we've shown.
int index = position - (position / AD_DISPLAY_FREQUENCY) - 1;
Item postItem = mPostItems.get(index);
postHolder.tvPostContent.setText(postItem.getItem());
postHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG", "onClick: "+index);
}
});
}
}
@Override
public int getItemCount() {
return mPostItems.size() + mAdItems.size();
}
Any help would be greatly appreciated任何帮助将不胜感激
I am using Facebook native ads in recycleview and it is working perfectly fine.我在 recycleview 中使用 Facebook 原生广告,它运行良好。 But the problem i am facing is that when the ads show up in my recycleview the ads start from the position of 0. I would like to show them lets say after every five items starting from the 6th position.但我面临的问题是,当广告出现在我的回收视图中时,广告从 0 的 position 开始。我想向他们展示,让他们说,从第 6 个 position 开始,每五个项目之后。 Can any one help here is my code.任何人都可以在这里帮助是我的代码。
Activity活动
public class FacebookNativeAds extends AppCompatActivity {
private NativeAdsManager mNativeAdsManager;
NativeAdRecyclerAdapter adapter;
private final String NATIVE_PLACEMENT_ID = "XXXXXXXXXXXXXXXXXXXXXXXX";
private static final String TAG = "FacebookNativeAds";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_facebook_native_ads);
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
AudienceNetworkAds.initialize(this);
AppDatabase database = AppDatabase.getDatabase(this);
Dao dao = database.dao();
mNativeAdsManager = new NativeAdsManager(this, NATIVE_PLACEMENT_ID, 5);
mNativeAdsManager.loadAds();
mNativeAdsManager.setListener(new NativeAdsManager.Listener() {
@Override
public void onAdsLoaded() {
Log.d(TAG, "onAdsLoaded: ");
adapter.notifyDataSetChanged();
Toast.makeText(FacebookNativeAds.this, "onAdsLoaded", Toast.LENGTH_SHORT).show();
}
@Override
public void onAdError(AdError adError) {
Log.d(TAG, "onAdError: ");
Toast.makeText(FacebookNativeAds.this, ""+ adError.getErrorMessage(), Toast.LENGTH_SHORT).show();
}
});
RecyclerView recyclerView = findViewById(R.id.quote_recyclerview2);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
adapter = new NativeAdRecyclerAdapter(this, dao.getData, mNativeAdsManager);
recyclerView.setAdapter(adapter);
}
and here is my adapter.这是我的适配器。
public class NativeAdRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<Item> mPostItems;
private List<NativeAd> mAdItems;
private NativeAdsManager mNativeAdsManager;
private Activity mActivity;
private static final int AD_DISPLAY_FREQUENCY = 5;
private static final int POST_TYPE = 0;
private static final int AD_TYPE = 1;
public NativeAdRecyclerAdapter(
Activity activity, List<Item> postItems, NativeAdsManager nativeAdsManager) {
mNativeAdsManager = nativeAdsManager;
mPostItems = postItems;
mAdItems = new ArrayList<>();
mActivity = activity;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == AD_TYPE) {
NativeAdLayout inflatedView =
(NativeAdLayout)
LayoutInflater.from(parent.getContext())
.inflate(R.layout.native_ad_layout, parent, false);
return new AdHolder(inflatedView);
} else {
View inflatedView =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new PostHolder(inflatedView);
}
}
@Override
public int getItemViewType(int position) {
return position % AD_DISPLAY_FREQUENCY == 0 ? AD_TYPE : POST_TYPE;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder.getItemViewType() == AD_TYPE) {
NativeAd ad;
if (mAdItems.size() > position / AD_DISPLAY_FREQUENCY) {
ad = mAdItems.get(position / AD_DISPLAY_FREQUENCY);
} else {
ad = mNativeAdsManager.nextNativeAd();
if (ad != null) {
if (!ad.isAdInvalidated()) {
mAdItems.add(ad);
} else {
Log.w(NativeAdRecyclerAdapter.class.getSimpleName(), "Ad is invalidated!");
}
}
}
AdHolder adHolder = (AdHolder) holder;
adHolder.adChoicesContainer.removeAllViews();
if (ad != null) {
adHolder.layoutContainer.setVisibility(View.VISIBLE);
adHolder.tvAdTitle.setText(ad.getAdvertiserName());
adHolder.tvAdBody.setText(ad.getAdBodyText());
adHolder.tvAdSocialContext.setText(ad.getAdSocialContext());
adHolder.tvAdSponsoredLabel.setText(ad.getSponsoredTranslation());
adHolder.btnAdCallToAction.setText(ad.getAdCallToAction());
adHolder.btnAdCallToAction.setVisibility(
ad.hasCallToAction() ? View.VISIBLE : View.INVISIBLE);
AdOptionsView adOptionsView = new AdOptionsView(mActivity, ad, adHolder.nativeAdLayout);
adHolder.adChoicesContainer.addView(adOptionsView, 0);
List<View> clickableViews = new ArrayList<>();
clickableViews.add(adHolder.ivAdIcon);
clickableViews.add(adHolder.mvAdMedia);
clickableViews.add(adHolder.btnAdCallToAction);
ad.registerViewForInteraction(
adHolder.nativeAdLayout, adHolder.mvAdMedia, adHolder.ivAdIcon, clickableViews);
}
} else {
PostHolder postHolder = (PostHolder) holder;
// Calculate where the next postItem index is by subtracting ads we've shown.
int index = position - (position / AD_DISPLAY_FREQUENCY) - 1;
Item postItem = mPostItems.get(index);
postHolder.tvPostContent.setText(postItem.getItem());
postHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG", "onClick: "+index);
}
});
}
}
@Override
public int getItemCount() {
return mPostItems.size() + mAdItems.size();
}
Any help would be greatly appreciated任何帮助将不胜感激
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.