获取数据时出错位置索引21-大小20在我的适配器中



我正在尝试在recyclerview中实现Native Ads。我使用回收器视图从firebase获取数据,并在其中实现原生广告。但我得到了索引21的错误,大小21。请帮帮我。下面是我的代码。注意-我是从YOUTUBE教程中编写代码的。

package com.saidev.instagramquotes;

import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.facebook.ads.AdOptionsView;
import com.facebook.ads.NativeAd;
import com.facebook.ads.NativeAdLayout;
import com.facebook.ads.NativeAdsManager;
import java.util.ArrayList;
import java.util.List;
import static androidx.core.content.ContextCompat.startActivity;
import static com.saidev.instagramquotes.MainActivity.interstitialAd;
public class HelperAdapter extends RecyclerView.Adapter {
final Context context;
List<FetchData> fetchDataList;
List<NativeAd> AdItems;
ImageButton copy;
TextView text;
ImageButton share;
View view;
HelperAdapter.ViewHolderClass viewHolderClass;
NativeAdsManager nativeAdsManager;
public static final int AD_FREQUENCY=4;
public final int post_type=0;
public final int ad_type=1;

public HelperAdapter(List<FetchData> fetchDataList, Context context, NativeAdsManager nativeAdsManager) {
this.fetchDataList = fetchDataList;
this.context = context;
this.nativeAdsManager = nativeAdsManager;
AdItems = new ArrayList<>();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType==ad_type){
NativeAdLayout nativeAdLayout = (NativeAdLayout) LayoutInflater.from(parent.getContext()).inflate(R.layout.native_ad,parent,false);
return new nativeholder(nativeAdLayout);
}
else {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
viewHolderClass = new ViewHolderClass(view);
copy = view.findViewById(R.id.copy);
text = view.findViewById(R.id.quote);
share = view.findViewById(R.id.share);
return viewHolderClass;
}
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {
int viewtype = getItemViewType(position); <-- I am getting an error here.
switch (viewtype){
case ad_type:
NativeAd ad;
if (AdItems.size()>position/AD_FREQUENCY){
ad = AdItems.get(position/AD_FREQUENCY);
}
else{
ad = nativeAdsManager.nextNativeAd();
if (ad!=null){
if (!ad.isAdInvalidated()){
AdItems.add(ad);
}
}
}
nativeholder adHolder = (nativeholder)holder;  <-- I have created another viewholder for native ads
adHolder.AdChoicesContainer.removeAllViews();
if (ad!=null){
adHolder.AdTitile.setText(ad.getAdvertiserName());
adHolder.AdBody.setText(ad.getAdBodyText());
adHolder.AdSocialContext.setText(ad.getAdSocialContext());
adHolder.SponsoredLabel.setText("Sponsored");
adHolder.CallToAction.setText(ad.getAdCallToAction());
adHolder.CallToAction.setVisibility(ad.hasCallToAction() ? View.VISIBLE : View.INVISIBLE);
AdOptionsView adOptionsView = new AdOptionsView(view.getContext(), ad, adHolder.nativeAdLayout);
adHolder.AdChoicesContainer.addView(adOptionsView, 0);
List<View> clickables = new ArrayList<>();
clickables.add(adHolder.iAdIcon);
clickables.add(adHolder.mAdView);
clickables.add(adHolder.CallToAction);
ad.registerViewForInteraction(adHolder.nativeAdLayout, adHolder.mAdView, adHolder.iAdIcon, clickables);
}
break;
case post_type:
ViewHolderClass viewHolderClass = (ViewHolderClass)holder;
FetchData fetchData = fetchDataList.get(position);
viewHolderClass.quotes.setText(fetchData.getQuotes());

copy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ClipboardManager clipboard = (ClipboardManager) v.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip  = ClipData.newPlainText("quotes", ((ViewHolderClass) holder).quotes.getText().toString());
clipboard.setPrimaryClip(clip);
Toast.makeText(v.getContext(), "Text Copied", Toast.LENGTH_SHORT).show();
interstitialAd.show();
}
});


share.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("text/plain");
String cap = ((ViewHolderClass) holder).quotes.getText().toString();
share.putExtra(Intent.EXTRA_TEXT, cap);
v.getContext().startActivity(Intent.createChooser(share, "Share Using"));
}
});

break;
}
}
@Override
public int getItemViewType(int position) {
return position % AD_FREQUENCY==0&& position != 0 ? ad_type:post_type; <-- I think the mistake is here
}
@Override
public int getItemCount() {
return fetchDataList.size() + (AdItems.size()/AD_FREQUENCY); <-- or here
}


public class ViewHolderClass extends RecyclerView.ViewHolder{
TextView quotes;
public ViewHolderClass(@NonNull View itemView) {
super(itemView);
quotes = itemView.findViewById(R.id.quote);
}
}

}

我和那个家伙在youtube教程里做的一样。但当我将视图滚动到最后一个索引时,我的应用程序崩溃,并给出错误Indes 21,size 21。请告诉我应该做哪些更改才能使代码正常工作。

如果没有完整的代码,很难找到问题,但我认为你必须检查所有的anyList.size(),记住这一点:由于列表和数组索引从0开始,所以它们最后一项的索引是anyList.size()-1

最新更新