Embedding ads within Recyclerview Embedding ads within Recyclerview android android

Embedding ads within Recyclerview


In your adapter, you first need to override getItemViewType, for example:

@Overridepublic int getItemViewType(int position) {    if (position % 5 == 0)        return AD_TYPE;     return CONTENT_TYPE;}

Then in onCreateViewHolder, inflate a different view according to the type. Something like this:

@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {    View v = null;    if (viewType == AD_TYPE)    {        v = new AdView(activity, AdSize.BANNER, ADMOB_ID);        float density = activity.getResources().getDisplayMetrics().density;        int height = Math.round(AdSize.BANNER.getHeight() * density);        AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT,height);        v.setLayoutParams(params);     AdRequest adRequest = new AdRequest.Builder().build();        if (adRequest != null && v != null){            v.loadAd(adRequest);         }    }    else         v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item_layout, viewGroup, false);    RecyclerView.ViewHolder viewHolder = new RecyclerView.ViewHolder(v);    return viewHolder;}


How to add AD list items and don't skip content items and don't insert null items to content list?

private static final int LIST_AD_DELTA = 3;private static final int CONTENT = 0;private static final int AD = 1;@Overridepublic int getItemViewType(int position) {    if (position > 0 && position % LIST_AD_DELTA == 0) {        return AD;    }    return CONTENT;}@Overridepublic BaseRecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {    if (viewType == CONTENT) {        return new ContentRecyclerHolder(parent, layoutId) {            @Override            protected void onCardClick(CardView card) {                fragmentManager.showPagerFragmentWithTransition(card.getContext(), getRealPosition(getAdapterPosition()));            }        };    } else {        return new AdRecyclerHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_ad, parent, false));    }}@Overridepublic int getItemCount() {    int additionalContent = 0;    if (data.size() > 0 && LIST_AD_DELTA > 0 && data.size() > LIST_AD_DELTA) {        additionalContent = data.size() / LIST_AD_DELTA;    }    return data.size() + additionalContent;}@Overridepublic void onBindViewHolder(BaseRecyclerHolder baseHolder, int position) {    if (getItemViewType(position) == CONTENT) {        ContentRecyclerHolder holder = (ContentRecyclerHolder) baseHolder;        Content content = data.get(getRealPosition(position));    } else {        AdRecyclerHolder holder = (AdRecyclerHolder) baseHolder;            AdRequest adRequest = new AdRequest.Builder().build();            if (adRequest != null && holder.adView != null){                holder.adView.loadAd(adRequest);             }    }}private int getRealPosition(int position) {    if (LIST_AD_DELTA == 0) {        return position;    } else {        return position - position / LIST_AD_DELTA;    }}


In your ArrayList, add null values to positions you want to show ads

    for(int i=0;i<arr.size();i++){       if(i%5==0)       {         alist.add(null);       }       alist.add(arr.get(i));    }

Then in getItemViewType(),

  @Overridepublic int getItemViewType(int position) {   if(qlist.get(position)==null)       return AD_TYPE;   return CONTENT_TYPE;}

Then,

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    View v = null;    ViewHolder vh=null;    if (viewType == AD_TYPE)    {        v=inflater.inflate(R.layout.adview_item, parent, false);        vh=new AdviewHolder(v);    }    else {        v = inflater.inflate(R.layout.cardview_items, parent, false);        vh = new ContentViewHolder(v);    }    return vh;}

This will not skip any items but will insert ads in to required positions.