0

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) { } })
    }   
}
Kevin Roy
  • 21
  • 1
  • How is inserting an item in between inside an `ArrayList` is depricated ? That's all it takes you already have two view type for adapter . – ADM May 23 '21 at 11:48
  • @ADM But the ad is taking the post position, it loads instead of the post. For example, if we have 5 posts in position 4 the ad loads instead of the fourth post then you'll find the fifth post directly. where's the fourth post from the list? – Kevin Roy May 23 '21 at 12:07
  • Your content is getting override because `getItemCount` still return the size of Array list . You need to return the updated Size i.e `list.Size+ads.size` . See the answer in duplicate link – ADM May 23 '21 at 12:13

0 Answers0