Android 筛选时显示的RecyclerView项目类型不正确

Android 筛选时显示的RecyclerView项目类型不正确,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,为什么每次我过滤我的RecyclerView时都会显示Ad视图而不是结果?有没有办法防止广告出现在过滤后的回收视图中 预期结果 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ll_rv" android:orientation="vertical"

为什么每次我过滤我的
RecyclerView
时都会显示
Ad
视图而不是结果?有没有办法防止
广告
出现在过滤后的
回收视图

预期结果

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_rv"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/mRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        android:scrollbarStyle="outsideInset"/>

</LinearLayout>

当前结果

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_rv"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/mRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        android:scrollbarStyle="outsideInset"/>

</LinearLayout>

适配器类

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

    lateinit var mAdView : AdView

    private val companyFilter = object : Filter() {
        override fun performFiltering(constraint: CharSequence?): FilterResults {
            val filteredList = ArrayList<ItemRV>()

            if (constraint == null || constraint.isEmpty()) {
                filteredList.addAll(myListFull)
            } else {
                val filterPattern = constraint.toString().toLowerCase().trim { it <= ' ' }

                for (item in myListFull) {
                    if (item.areaName.toLowerCase().contains(filterPattern) || item.areaCode.contains(
                            filterPattern
                        )
                    ) {
                        filteredList.add(item)
                    }
                }
            }

            val results = FilterResults()
            results.values = filteredList
            return results
        }

        override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
            myList.clear()
            myList.addAll(results!!.values as List<MyItem>)
            notifyDataSetChanged()
        }
    }

    override fun getFilter(): Filter {
        return companyFilter
    }

    private val itemRV = 1
    private val itemAD = 2

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

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

        return if (viewType == itemAD) {
            val v = LayoutInflater.from(mCtx).inflate(R.layout.item_ad, parent, false)
            AdViewHolder(v)
        } else {
            val v = LayoutInflater.from(mCtx).inflate(R.layout.item_rv, parent, false)
            AreaViewHolder(v)
        }
    }

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

            is AreaViewHolder -> {
            val positionToBind = position - position / 3 - 1

            val product = myList[positionToBind]

            holder.tvTitle.text = product.itemName
            holder.tvSubtitle.text = product.itemDescription
            }
        }
    }

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


    inner class AdViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView
    .ViewHolder(itemView), View.OnClickListener {
        override fun onClick(v: View?) {
        }
    }

    inner class AreaViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView
    .ViewHolder(itemView), View.OnClickListener {
        var tvTitle: TextView = itemView.rvitem_title
        var tvSubtitle: TextView = itemView.rvitem_subtitle
    }

    interface ItemClickListener {
        fun onItemClick(view: View, position: Int)
    }
}
类适配器(
私有val mCtx:上下文,
var myList:MutableList
):RecyclerView.Adapter(),Filterable,PopupMenu.OnMenuItemClickListener{
private val myListFull=myList.toMutableList()
私有变量mClickListener:ItemClickListener?=null
lateinit var mAdView:AdView
private val companyFilter=object:Filter(){
重写fun performFiltering(约束:CharSequence?):FilterResults{
val filteredList=ArrayList()
if(constraint==null | | constraint.isEmpty()){
filteredList.addAll(myListFull)
}否则{
val filterPattern=constraint.toString().toLowerCase().trim{it{
MobileAds.initialize(mCtx){}
mAdView=holder.itemView.findviewbyd(R.id.adView)
val adRequest=adRequest.Builder().build()
mAdView.loadAd(adRequest)
}
是AreaViewHolder->{
val positionToBind=位置-位置/3-1
val product=myList[positionToBind]
holder.tvTitle.text=product.itemName
holder.tvstitle.text=product.itemsdescription
}
}
}
重写getItemCount():Int{
返回myList.size
}
内部类AdViewHolder(itemView:View):androidx.recyclerview.widget.recyclerview
.ViewHolder(itemView),View.OnClickListener{
覆盖有趣的onClick(v:视图?){
}
}
内部类AreaViewHolder(itemView:View):androidx.recyclerview.widget.recyclerview
.ViewHolder(itemView),View.OnClickListener{
var tvTitle:TextView=itemView.rvitem_title
var tvSubtitle:TextView=itemView.rvitem_subtitle
}
接口项ClickListener{
单击(视图:视图,位置:Int)
}
}
活动布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_rv"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/mRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        android:scrollbarStyle="outsideInset"/>

</LinearLayout>

广告项目t类型

<com.google.android.gms.ads.AdView
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/adView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_alignParentBottom="true"
    ads:adSize="BANNER"
    ads:adUnitId="ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXX">
</com.google.android.gms.ads.AdView>
<RelativeLayout
    android:id="@+id/relativelayout_rvitem"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="top"
    android:baselineAligned="false"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:id="@+id/ll_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="100">
        <TextView
            android:id="@+id/rvitem_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal"
            android:layout_weight="95"/>

        <ImageButton
            android:id="@+id/ib_overflow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_more_vertical"
            android:background="?attr/selectableItemBackgroundBorderless"
            android:layout_weight="5"/>
    </LinearLayout>

    <TextView android:id="@+id/rvitem_subtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/ll_title" />
</RelativeLayout>

text查看项目类型

<com.google.android.gms.ads.AdView
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/adView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_alignParentBottom="true"
    ads:adSize="BANNER"
    ads:adUnitId="ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXX">
</com.google.android.gms.ads.AdView>
<RelativeLayout
    android:id="@+id/relativelayout_rvitem"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="top"
    android:baselineAligned="false"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:id="@+id/ll_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="100">
        <TextView
            android:id="@+id/rvitem_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal"
            android:layout_weight="95"/>

        <ImageButton
            android:id="@+id/ib_overflow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_more_vertical"
            android:background="?attr/selectableItemBackgroundBorderless"
            android:layout_weight="5"/>
    </LinearLayout>

    <TextView android:id="@+id/rvitem_subtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/ll_title" />
</RelativeLayout>

您的
getItemViewType
始终在位置0处返回广告:

覆盖getItemViewType(位置:Int):Int{
如果返回(位置%3==0){
项目
}否则{
项目V
}
}
考虑将其更改为不在位置0执行此操作,例如:

返回if(位置!=0&&position%3==0){

java.lang.ArrayIndexOutOfBoundsException:length=823;index=-1
那里需要堆栈跟踪…可能还有其他错误,但这就是为什么你在位置0处看到广告的原因。如果你不相信我,在onBindViewHolder中放一条日志语句,记录该位置以及它是否是广告。不,等等,我看到问题了。你知道了吗'我们正在从您的
位置减去1以绑定
,因此现在您没有在位置0中显示广告,它正在尝试获取项目-1。也将其删除,如果您没有任何其他错误,它应该会起作用。但是,如果您不相信我,请再次记录它,而不是在不检查的情况下向下投票给我。