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

问题描述

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

任何帮助将不胜感激

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)