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.