简体   繁体   English

recyclerview中Facebook原生广告的变化指数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM