首页 > 解决方案 > 在 firebase 数据库的 recyclerview 中每 5 个项目后显示 admob 广告

问题描述

我正在构建一个带有 firebase 数据库的 android 应用程序,用户可以在其中将帖子发布到主要提要。我想在 recyclerview 提要中每 5 个项目后插入一个 AdMob 广告。已阅读相关问题,但要么已弃用,要么未提及如何在列表中插入广告。我成功地添加和阅读了来自 firebase 的帖子,还使用原生模板实现了原生广告。你能帮忙解释在 postList 之间插入广告的逻辑吗?这是我的代码 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  }
    }
}

我加载列表的片段:

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) { } })
    }   
}

标签: androidfirebasekotlinfirebase-realtime-databaseadmob

解决方案


推荐阅读