简体   繁体   English

Admob RecyclerView 中的原生广告 android

[英]Admob Native ads in RecyclerView android

I am facing this issue with my Recycler view while placing admob ads在放置 admob 广告时,我的 Recycler 视图遇到了这个问题

Problem: It is actually replaced the item from the list and place the ads问题:它实际上是替换列表中的项目并放置广告

在此处输入图像描述

After apply this solution recommended by one of the stack-overflow member the problem occur应用堆栈溢出成员之一推荐的此解决方案后,会出现问题

How to place Admob Native Advanced Ads in recycler view android? 如何在回收站视图 android 中放置 Admob 原生高级广告?

This is code i am using:这是我正在使用的代码:

@Override
public int getItemViewType(int position) {
    if (position>1 && (position+1) % 4 == 0) {

        return AD_TYPE;
    } else {

        return CONTENT_TYPE;
    }

}

@Override
public int getItemCount() {
    return articleList.size();
}

Here is full code这是完整的代码

public class ArticleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private Context mContext;
private List<ArticleJson> articleList;
String titleoflist;
private static final int AD_TYPE = 2;
private static final int CONTENT_TYPE = 1;

public class MyViewHolder extends RecyclerView.ViewHolder {
    TextView txtTitle;
    LinearLayout linearLayout;
    private ArticleJson m_articleJson;

    public MyViewHolder(View view) {
        super(view);
        txtTitle = view.findViewById(R.id.texViewArticleTitle);
      
    }

    public void bindView(final ArticleJson articleJson){
        m_articleJson = articleJson;

    }
}

class adViewHolder extends RecyclerView.ViewHolder {
    TemplateView Adtemplate;
    UnifiedNativeAdView unifiedNativeAdView;

    public adViewHolder(@NonNull View itemView) {
        super(itemView);
        Adtemplate = itemView.findViewById(R.id.mednative_placeholder1);
        unifiedNativeAdView = itemView.findViewById(R.id.native_ad_view);
    }
}

public ArticleAdapter(Context mContext, List<ArticleJson> articleList,String titleoflist) {
    this.mContext = mContext;
    this.articleList = articleList;
    this.titleoflist = titleoflist;
}


@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    if (viewType == AD_TYPE) {
        adViewHolder madViewHolder = new adViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_ads, null, false));
        return madViewHolder;
    } else{
        MyViewHolder mYourViewHolder = new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_article, null, false));
        return mYourViewHolder;
    }
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    if (getItemViewType(position) == CONTENT_TYPE) {
        final ArticleJson articleJson = articleList.get(position);
        ((MyViewHolder)holder).bindView(articleJson);
        ((MyViewHolder)holder).linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
             
            }
        });

}else if (getItemViewType(position) == AD_TYPE){

        MobileAds.initialize(mContext, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {}
        });

        AdLoader adLoader2 = new AdLoader.Builder(mContext, "ca-app-pub-8376062614303044/3237856178")
                .forUnifiedNativeAd(new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() {
                    @Override
                    public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) {
                        UnifiedNativeAdView unifiedNativeAdView = ((adViewHolder) holder).unifiedNativeAdView;
                        unifiedNativeAdView.setVisibility(View.VISIBLE);
                        NativeTemplateStyle styles = new
                                NativeTemplateStyle.Builder().build();

                        TemplateView template = ((adViewHolder) holder).Adtemplate;
                        template.setStyles(styles);
                        template.setNativeAd(unifiedNativeAd);


                    }
                })
                .build();

        adLoader2.loadAd(new AdRequest.Builder().build());



    }
}

@Override
public int getItemCount() {
    return articleList.size();
}

@Override
public int getItemViewType(int position) {
    if (position>1 && (position+1) % 4 == 0) {

        return AD_TYPE;
    } else {

        return CONTENT_TYPE;
    }

}

} }

public class ArticleJson {
private String mid;
private String mTitle;
boolean isAd = false;

public ArticleJson() {

}
public ArticleJson(String mid, String mTitle) {
    this.mTitle = mTitle;
    this.mid = mid;
}

public String getMid() {
    return mid;
}

public String getmTitle() {
    return mTitle;
}}

The problem occurred because you are using only the original data list in your adapter without having the ads objects into the list.出现问题是因为您只使用适配器中的原始数据列表,而没有将广告对象放入列表中。 So according to your example above you will have only 10 items (original data) instead of 13 (with the ads objects).因此,根据您上面的示例,您将只有 10 个项目(原始数据)而不是 13 个(带有广告对象)。

To achieve the result you want without affecting the original data you can do something like below:要在不影响原始数据的情况下达到您想要的结果,您可以执行以下操作:

1 .Change your ArticleAdapter constructor to be like below. 1 .将您的 ArticleAdapter 构造函数更改为如下所示。 Here i have created a new List of ArticleJson (articlesWithAdsList) which holds both ads and items and i am placing each Ad in every 3rd row using the adPos (Ad frequency number) variable where you can change this according to your needs.在这里,我创建了一个新的 ArticleJson 列表(articlesWithAdsList),其中包含广告和项目,并且我使用adPos (广告频率数)变量将每个广告放置在每 3 行中,您可以根据需要进行更改。 To distinguish the Ad from item i have added a boolean flag isAd in the ArticleJson object and finally your articleList is pointing to the new created articlesWithAdsList.为了区分广告和项目,我在 ArticleJson object 中添加了 boolean 标志isAd ,最后您的 articleList 指向新创建的 articleWithAdsList。

public ArticleAdapter(Context mContext, List<ArticleJson> articleList, String titleoflist) {
        this.mContext = mContext;
        //prepare a new List<ArticleJson> having both ads and data
        List<ArticleJson> articlesWithAdsList = new ArrayList<>();
        if(articleList!=null && articleList.size()>0)
        {
            int adPos = 0;
            //iterate through the actual data list and prepare the new articlesWithAdsList
            for (int i = 0; i < articleList.size(); i++)
            {
                //initialize and add the ad in every 3rd row
                if(adPos == 3) {
                    ArticleJson advertise = new ArticleJson();
                    advertise.isAd = true;
                    articlesWithAdsList.add(advertise);
                    adPos = 0;
                }
                //and add the actual Item ArticleJson object
                ArticleJson articleJson = articleList.get(i);
                articleJson.isAd = false;
                articlesWithAdsList.add(articleJson);
                adPos++;
            }
        }
        //articleList now have both ads and data items
        this.articleList = articlesWithAdsList;
        this.titleoflist = titleoflist;
    }

2 .Change getItemViewType(int position) to use the isAd flag to distinguish the AD_TYPE from Item CONTENT_TYPE like below: 2 .更改 getItemViewType(int position)以使用isAd标志来区分 AD_TYPE 和 Item CONTENT_TYPE,如下所示:

@Override
public int getItemViewType(int position) {
    ArticleJson articleJson = articleList.get(position);
    if (articleJson.isAd) {
        return AD_TYPE;
    } else {
        return CONTENT_TYPE;
    }
}

3 .And finally add the isAd flag into your ArticleJson object: 3 .最后将isAd标志添加到您的 ArticleJson object 中:

public class ArticleJson {
    boolean isAd = false;
    public ArticleJson() {
   
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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