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。也将其删除,如果您没有任何其他错误,它应该会起作用。但是,如果您不相信我,请再次记录它,而不是在不检查的情况下向下投票给我。