首页 > 解决方案 > 具有多个视图类型的 RecyclerView,具有持续的位置计数

问题描述

有没有办法在不替换任何项目的情况下使用View多种类型?RecyclerView

对于position0 和 my 中的每 4 个positionRecyclerView我希望显示第 2View种类型,而无需替换如果第 1View种类型存在时该位置的内容。即显示第二种View类型,然后显示预期的第View一种类型。

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    when(holder) {
        is ViewHolderA -> {
            MobileAds.initialize(mCtx) {}
            mAdView = holder.itemView.findViewById(R.id.adView)
            val adRequest = AdRequest.Builder().build()
            mAdView.loadAd(adRequest)
        }

        is ViewHolderB -> {
        val product = my[holder.adapterPosition]

        holder.tvTitle.text = product.itemTitle
        }
    }
}

override fun getItemViewType(position: Int): Int {
    return if (position % 4 == 0) {
        typeA
    } else {
        typeB
    }
}

预期结果

在此处输入图像描述

当前结果

在此处输入图像描述

在此处输入图像描述

标签: androidkotlinandroid-recyclerviewandroid-view

解决方案


修改您onBindViewHolder以绑定项目position - position / 4 - 1

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    when(holder) {
        is ViewHolderA -> {
            MobileAds.initialize(mCtx) {}
            mAdView = holder.itemView.findViewById(R.id.adView)
            val adRequest = AdRequest.Builder().build()
            mAdView.loadAd(adRequest)
        }

        is ViewHolderB -> {
            val positionToBind = position - position / 4 - 1
            val product = my[positionToBind]
            holder.tvTitle.text = product.itemTitle
        }
    }
}

这将返回

position 0: -1 (ad so it doesnt apply)
position 1: 0 (item A)
position 2: 1 (item B)
position 3: 2 (item C)
position 4: 2 (ad so it doesnt apply)
position 5: 3 (item D)
etc.

推荐阅读