I'm building an android app with a firebase database where users can publish posts to the main feed. I want to insert an AdMob ad after every 5 items in the recyclerview feed. Already read related questions but either they're deprecated or not mentioning how to insert ad in the list. I successfully add and read posts from firebase and also implement native ads with native templates. Can you help with the logic to insert ads between the postList? Here's my code RecyclerviewAdapter:
class PostAdapter(private val mContext: Context, private val mPost: List<Post>):RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var POST_TYPE = 1
var AD_TYPE = 2
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
if (viewType == AD_TYPE){
val view = LayoutInflater.from(mContext).inflate(R.layout.ads_layout, parent, false)
return ADViewHolder(view)
}
else{
val view = LayoutInflater.from(mContext).inflate(R.layout.post_layout,parent,false)
return PostViewHolder(view)
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if(getItemViewType(position) == POST_TYPE){
val postHolder = holder as PostViewHolder
val post = mPost[position]
pHolder.userName.text = post.getUsername()
pHolder.description.text = post.getDescription()
// .... get post info }
}
else if (getItemViewType(position) == AD_TYPE){
val adLoader = AdLoader.Builder(mContext, "ca-app-pub-3940256099942544/2247696110")
.forNativeAd(NativeAd.OnNativeAdLoadedListener { ad: NativeAd ->
val styles = NativeTemplateStyle.Builder().build()
val template: TemplateView = (holder as ADViewHolder).AdTemplate
template.setStyles(styles)
template.setNativeAd(ad)
})
.withAdListener(object : AdListener() {
override fun onAdFailedToLoad(adError: LoadAdError) {}
})
.withNativeAdOptions(NativeAdOptions.Builder()
.build())
.build()
adLoader.loadAd(AdRequest.Builder().build())
}
}
override fun getItemCount(): Int {
return mPost.size
}
inner class PostViewHolder(@NonNull itemView: View): RecyclerView.ViewHolder(itemView) {
var userName:TextView
var description:TextView
init {
userName = itemView.findViewById(R.id.username_post)
description = itemView.findViewById(R.id.description)
}
}
inner class ADViewHolder(@NonNull itemView: View): RecyclerView.ViewHolder(itemView) {
var AdTemplate:TemplateView
init{
AdTemplate= itemView.findViewById(R.id.my_template) }
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getItemViewType(position: Int): Int {
return if (position!=0 && position%4 == 0){ AD_TYPE }
else{ POST_TYPE }
}
}
Fragment where I load the list:
class HomeFragment : Fragment() {
var postAdapter: PostAdapter? =null
private var postList: MutableList<Post>? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.home_explore, container, false)
recyclerView = view.findViewById(R.id.recycler_view_home)
val linearLayoutManager = LinearLayoutManager(context)
recyclerView.layoutManager = linearLayoutManager
postList= ArrayList()
postAdapter = context?.let {PostAdapter(it, postList as ArrayList<Post>) }
recyclerView.adapter = postAdapter
return view }
private fun retrievePosts() {
val postRef = FirebaseDatabase.getInstance().reference.child("Posts").limitToLast(100)
postRef.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(p0: DataSnapshot) {
if (p0.exists()) {
postList!!.clear()
for (snapshot in p0.children) {
val post = snapshot.getValue(ImagePost::class.java)!!
(postList as ArrayList<Post>).add(post)
}
postAdapter?.notifyDataSetChanged()
}
}
override fun onCancelled(p0: DatabaseError) { } })
}
}