Kotlin - Как реализовать рекламу AdMob как вид представления внутри RecyclerView

Как правильно внедрить рекламу AdMob (как другой тип представления) в Kotlin RecyclerView, который содержит дополнительный (но другой) тип представления? Я не видел никаких полезных уроков онлайн. У меня проблема с методом onCreateViewHolder как я не уверен в правильном способе его изменения.

class AdapterMain(
    private val mCtx: Context,
    var myList: MutableList<ItemRV>
) : androidx.recyclerview.widget.RecyclerView.Adapter<AdapterMain
.MyViewHolder>() {
    private val myListFull = myList.toMutableList()
    private var mClickListener: ItemClickListener? = null

    private val itemRV = 1
    private val itemAD = 2

    override fun getItemViewType(position: Int): Int {
        return if (position % 5 == 0) {
            itemRV
        } else {
            itemAD
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) {
        return if (viewType == itemAD) {
            val adLoader = AdLoader.Builder(mCtx, "ca-app-pub-5544923106349792~1702536043")
                .forUnifiedNativeAd { ad : UnifiedNativeAd ->
                    // Show the ad.
                }
                .withAdListener(object : AdListener() {
                    override fun onAdFailedToLoad(errorCode: Int) {
                        // Handle the failure by logging, altering the UI, and so on.
                    }
                })
                .withNativeAdOptions(
                    NativeAdOptions.Builder()
                    .build())
                .build()

            adLoader.loadAd(AdRequest.Builder().build())
        } else {
            val inflater = LayoutInflater.from(mCtx)
            val v = inflater.inflate(R.layout.rv_item, parent, false)
            return MyViewHolder(v)
        }
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        if (position == itemAD){

        } else {
            val product = myList[holder.adapterPosition]
            holder.tvTitle.text = product.itemName
        }
    }

    override fun getItemCount(): Int {
        return myList.size
    }

    inner class MyViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView
    .ViewHolder(itemView), View.OnClickListener {
        var tvTitle: TextView = itemView.tv_title
    }

    interface ItemClickListener {
        fun onItemClick(view: View, position: Int)
    }
}

Всего 1 ответ


Что вы хотите сделать, это создать 2 класса, которые расширяют ViewHolder ; один для вашего обычного контента, а другой для просмотра вашей рекламы. Вам нужно будет изменить некоторые из своих функций, чтобы использовать универсальный RecyclerView.ViewHolder вместо MyViewHolder поскольку он может быть одним из них.

В вашем onCreateViewHolder вы захотите создать одно или другое и вернуть его.

А затем в вашем onBindViewHolder , вы захотите загрузить / показать свое объявление.

class AdapterMain(
    private val mCtx: Context,
    var myList: MutableList<ItemRV>
) : androidx.recyclerview.widget.RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    private val myListFull = myList.toMutableList()
    private var mClickListener: ItemClickListener? = null

    private val itemRV = 1
    private val itemAD = 2

    override fun getItemViewType(position: Int): Int {
        return if (position % 5 == 0) {
            itemRV
        } else {
            itemAD
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) {

        // Create an ad view holder
        return if (viewType == itemAD) {
            val v = LayoutInflater.from(mCtx).inflate(R.layout.ad_item, parent, false)
            AdViewHolder(v)
        } else {
            val v = LayoutInflater.from(mCtx).inflate(R.layout.rv_item, parent, false)
            MyViewHolder(v)
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {


        when(holder) {
            // This is where you want to load/show the ad.
            is AdViewHolder -> {
                val adLoader = AdLoader.Builder(mCtx, "ca-app-pub-5544923106349792~1702536043")
                .forUnifiedNativeAd { ad : UnifiedNativeAd ->
                    // Show the ad.
                }
                .withAdListener(object : AdListener() {
                    override fun onAdFailedToLoad(errorCode: Int) {
                        // Handle the failure by logging, altering the UI, and so on.
                    }
                })
                .withNativeAdOptions(
                    NativeAdOptions.Builder()
                    .build())
                .build()

            adLoader.loadAd(AdRequest.Builder().build())
            }

            is MyViewHolder -> {
                val product = myList[holder.adapterPosition]
                holder.tvTitle.text = product.itemName
            }
        }
    }

    override fun getItemCount(): Int {
        return myList.size
    }

    inner class MyViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView
    .ViewHolder(itemView), View.OnClickListener {
        var tvTitle: TextView = itemView.tv_title
    }

    inner class AdViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView
    .ViewHolder(itemView), View.OnClickListener {
        // do any ad setup
    }

    interface ItemClickListener {
        fun onItemClick(view: View, position: Int)
    }
}

Есть идеи?

10000