android - 在 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) { } })
}
}
解决方案
推荐阅读
- qr-code - 打印 UTF-8 QR 码会显示变音符号的特殊字符
- spring-websocket - 使用 SimpleMessage Broker 的 Spring Websocket 在处理发送给客户端的消息时占用大量 CPU
- c# - 输出窗口中的 Visual Studio 消息源
- java - 使用@Test时没有main方法错误
- mysql - 优化联合请求
- asp.net - 按钮 onserverclient 不适用于 Asp.Net
- vue.js - nuxtlink 路径无法正常工作
- doctrine-orm - Symfony2.8 - 学说:模式:更新 - 添加新字段后无需更新
- port - 使用双端口网卡 Ping 特定以太网端口
- android - Android Studio > Javascript