带有Recycler View的Facebook原生广告

问题描述

我知道这个问题已经被问过好几次了,并且由不同的人回答。 我想在“回收者”视图中显示Facebook原生广告,并且创建了如下所示的适配器

package com.zurmati.ilock.Adapter;

public class MyNativeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    Context context;
    List<Themes> themesList;
    NativeAdsManager nativeAdsManager;
    int adItems = 0;

    List<NativeAd> mAdItems;

    private static final int AD_disPLAY_FREQUENCY = 3;
    private static final int POST_TYPE = 0;
    private static final int AD_TYPE = 1;

    public MyNativeAdapter(Context context,List<Themes> themesList,NativeAdsManager nativeAdsManager) {
        this.context = context;
        this.themesList = themesList;
        this.nativeAdsManager = nativeAdsManager;
        mAdItems = new ArrayList<>();
    }

这是我的OnCreaViewHolder,我在其中查看视图类型,以确定接下来要放大哪个视图

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
    if (viewType == AD_TYPE) {
        NativeAdLayout nativeAdLayout = (NativeAdLayout) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.layout_native,parent,false);
        return new UnifiedFbHolder(nativeAdLayout);
    } else {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_theme,false);
        MyNativeAdapter.ImageViewHolder imageViewHolder = new MyNativeAdapter.ImageViewHolder(view);
        return imageViewHolder;
    }
}

这是我绑定元素的onBindViewHolder类

 @Override
    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder,int position) {
        int viewType = getItemViewType(position);
        switch (viewType) {
            case AD_TYPE:
                NativeAd ad;
                if (mAdItems.size() > position / AD_disPLAY_FREQUENCY) {
                    ad = mAdItems.get(position / AD_disPLAY_FREQUENCY);

                } else {
                    ad = nativeAdsManager.nextNativeAd();
                    if (ad != null) {
                        if (!ad.isAdInvalidated()) {
                            mAdItems.add(ad);
                        }
                    }
                }

                UnifiedFbHolder adHolder = (UnifiedFbHolder) holder;
                adHolder.adChoicesContainer.removeAllViews();

                if (ad != null) {
                    adHolder.tvAdTitle.setText(ad.getAdvertiserName());
                    adHolder.tvAdBody.setText(ad.getAdBodyText());
                    adHolder.tvAdSocialContext.setText("Sponsored");
                    adHolder.btnCallToAction.setText(ad.getAdCallToAction());
                    adHolder.btnCallToAction.setVisibility(ad.hasCallToAction() ? View.VISIBLE : View.INVISIBLE);

                    AdOptionsView adOptionsView = new AdOptionsView(context,ad,adHolder.nativeAdLayout);
                    adHolder.adChoicesContainer.addView(adOptionsView,0);

                    List<View> clickAbleViews = new ArrayList<>();
                    clickAbleViews.add(adHolder.ivAdIcon);
                    clickAbleViews.add(adHolder.mvAdMedia);
                    clickAbleViews.add(adHolder.btnCallToAction);
                    ad.registerViewForInteraction(adHolder.nativeAdLayout,adHolder.mvAdMedia,adHolder.ivAdIcon,clickAbleViews);

                }

                break;

            case POST_TYPE:
                final ImageViewHolder imageViewHolder = (ImageViewHolder) holder;

                try {
                    Glide.with(context).load(themesList.get(holder.getAdapterPosition()).getimage()).into(imageViewHolder.imgTheme);

                } catch (Exception e) {
                    e.printstacktrace();
                }
                //Event
                imageViewHolder.setListener((v,pos) -> {
                    EventBus.getDefault().post(new ThemesItemClickEvent(themesList.get(pos).getimage(),pos,true));
                });
                break;
        }
    }

函数生成错误,它说数组大小为17而索引为17,它正在生成超出范围的异常的索引

    @Override
    public int getItemCount() {
        return themesList.size() + mAdItems.size();
    }

    @Override
    public int getItemViewType(int position) {
        if (position % AD_disPLAY_FREQUENCY == 0 && position != 0)
            return AD_TYPE;
        else
            return POST_TYPE;
    }

    public static class ImageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        @BindView(R.id.img_theme)
        ImageView imgTheme;
        Unbinder unbinder;

        IRecyclerClickListener listener;

        public void setListener(IRecyclerClickListener listener) {
            this.listener = listener;
        }

        public ImageViewHolder(@NonNull View itemView) {
            super(itemView);
            unbinder = ButterKnife.bind(this,itemView);
            itemView.setonClickListener(this);
        }

        @Override
        public void onClick(View v) {
            listener.onThemItemClick(v,getAdapterPosition());
        }
    }

    public static class UnifiedFbHolder extends RecyclerView.ViewHolder {

        public NativeAdLayout nativeAdLayout;
        public MediaView mvAdMedia,ivAdIcon;
        public TextView tvAdTitle,tvAdBody,tvAdSocialContext,tvAdSponsoredLable;

        public Button btnCallToAction;
        public LinearLayout adChoicesContainer;


        public UnifiedFbHolder(NativeAdLayout nativeAdLayout) {
            super(nativeAdLayout);
            this.nativeAdLayout = nativeAdLayout;

            mvAdMedia = nativeAdLayout.findViewById(R.id.native_ad_media);
            tvAdTitle = nativeAdLayout.findViewById(R.id.native_ad_title);
            tvAdBody = nativeAdLayout.findViewById(R.id.native_ad_body);
            tvAdSocialContext = nativeAdLayout.findViewById(R.id.native_ad_social_context);

            tvAdSponsoredLable = nativeAdLayout.findViewById(R.id.natibe_ad_sponsored_lable);
            btnCallToAction = nativeAdLayout.findViewById(R.id.native_ad_call_to_action);
            ivAdIcon = nativeAdLayout.findViewById(R.id.native_ad_icon);
            adChoicesContainer = nativeAdLayout.findViewById(R.id.ad_choses_container);


        }
    }

}

这是我的主要活动代码

private List<Themes> themesList;
NativeAdsManager nativeAdsManager;
private MyNativeAdapter myNativeAdapter;

 @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_themes,null,false);
        unbinder = ButterKnife.bind(this,root);

        initViews();
        return root;
    }

    private void initViews() {
        themesList = new ArrayList<>();


        addAdsToList();
        //Add themes into the list
        addThemesToList();

        recyclerView.setHasFixedSize(true);
        recyclerView.hasFixedSize();
        recyclerView.setItemViewCacheSize(themesList.size());
        recyclerView.setnestedScrollingEnabled(false);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        //Set layout and orientation for recycler view
        recyclerView.setLayoutManager(new GridLayoutManager(getContext(),2));
        recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView,0);

        //Setting List to the Recycler View using adapter
       // MyAdapter myAdapter = new MyAdapter(getContext(),themesList);
        myNativeAdapter = new MyNativeAdapter(getContext(),themesList,nativeAdsManager);
        /*FBNativeAdAdapter fbAdapter = FBNativeAdAdapter.Builder.with(getResources().getString(R.string.FbNativeAd),myAdapter)
                .adItemIterval(3)
                .build();*/
        recyclerView.setAdapter(myNativeAdapter);
    }

    private void addAdsToList() {
        nativeAdsManager = new NativeAdsManager(getContext(),getResources().getString(R.string.FbNativeAd),2);
        nativeAdsManager.loadAds();
        nativeAdsManager.setListener(this);
    }

    private void addThemesToList() {
        themesList.add(new Themes(R.drawable.a));
        themesList.add(new Themes(R.drawable.b));
        themesList.add(new Themes(R.drawable.c));
        themesList.add(new Themes(R.drawable.d));
        themesList.add(new Themes(R.drawable.e));
        themesList.add(new Themes(R.drawable.f));
        themesList.add(new Themes(R.drawable.g));
        themesList.add(new Themes(R.drawable.h));
        themesList.add(new Themes(R.drawable.i));
        themesList.add(new Themes(R.drawable.j));
        themesList.add(new Themes(R.drawable.k));
        themesList.add(new Themes(R.drawable.l));
        themesList.add(new Themes(R.drawable.m));
        themesList.add(new Themes(R.drawable.n));
        themesList.add(new Themes(R.drawable.o));
        themesList.add(new Themes(R.drawable.p));
        themesList.add(new Themes(R.drawable.q));
    }

    @Override
    public void onAdsLoaded() {
    }

    @Override
    public void onAdError(AdError adError) {

    }

解决方法

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

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

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