Facebook 原生广告在回收视图中改变位置

时间:2021-01-07 18:24:16

标签: android facebook arraylist android-recyclerview native-ads

我在 recycleview 中使用 Facebook 原生广告,效果很好。但我面临的问题是,当广告出现在我的回收视图中时,广告从 0 的位置开始。我想在从第 6 个位置开始的每五个项目之后显示它们。 任何人都可以帮助这里是我的代码。

活动

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);

}

这是我的适配器。

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();
    }

任何帮助将不胜感激

0 个答案:

没有答案