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

Android 在我的适配器中获取数据位置索引21-大小20时出错,android,android-recyclerview,Android,Android Recyclerview,我正在尝试在recyclerview中实现本地广告。我正在使用recycler视图从firebase获取数据,并在其中实现本机广告。但是我得到了索引21的错误,大小21。请帮帮我。 下面是我的代码。注意-我从YOUTUBE教程中编写了代码 package com.saidev.instagramquotes; import android.content.ClipData; import android.content.ClipboardManager; import android.con

我正在尝试在recyclerview中实现本地广告。我正在使用recycler视图从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);

        }
    }


}
package com.saidev.instagramqoutes;
导入android.content.ClipData;
导入android.content.ClipboardManager;
导入android.content.Context;
导入android.content.Intent;
导入android.text.Layout;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ImageButton;
导入android.widget.LinearLayout;
导入android.widget.TextView;
导入android.widget.Toast;
导入androidx.annotation.NonNull;
导入androidx.recyclerview.widget.recyclerview;
导入com.facebook.ads.AdOptionsView;
导入com.facebook.ads.NativeAd;
导入com.facebook.ads.nativeadalayout;
导入com.facebook.ads.NativeAdsManager;
导入java.util.ArrayList;
导入java.util.List;
导入静态androidx.core.content.ContextCompat.startActivity;
导入静态com.saidev.instagramqoutes.MainActivity.Interstituralad;
公共类HelperAdapter扩展了RecyclerView.Adapter{
最终语境;
列表获取数据列表;
列出项目;
图像按钮复制;
文本查看文本;
图像按钮共享;
视图;
HelperAdapter.ViewHolderClass ViewHolderClass;
本地经理本地经理;
公共静态最终int AD_频率=4;
公共最终int post_类型=0;
公共最终int ad_类型=1;
public HelperAdapter(列表获取数据列表、上下文上下文、NativeAdsManager NativeAdsManager){
this.fetchDataList=fetchDataList;
this.context=上下文;
this.nativeadmanager=nativeadmanager;
AdItems=新的ArrayList();
}
@非空
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
if(视图类型==ad_类型){
NativeAdLayout NativeAdLayout=(NativeAdLayout)LayoutInflater.from(parent.getContext()).FLATE(R.layout.native_ad,parent,false);
返回新的nativeholder(NativeAddLayout);
}
否则{
view=LayoutInflater.from(parent.getContext()).flate(R.layout.item_布局,parent,false);
viewHolderClass=新的viewHolderClass(视图);
copy=view.findviewbyd(R.id.copy);
text=view.findviewbyd(R.id.quote);
share=view.findviewbyd(R.id.share);
返回viewHolderClass;
}
}
@凌驾
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder,int位置){
int viewtype=getItemViewType(位置);位置/广告频率){
ad=AdItems.get(位置/ad_频率);
}
否则{
ad=nativeadmanager.nextnativeead();
如果(ad!=null){
如果(!ad.isAdInvalidated()){
AdItems.add(ad);
}
}
}

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

您希望解决问题的代码的哪一部分??当此应用程序崩溃时,您可以打开Android Studio窗口底部的“运行”选项卡,单击该选项卡时,会出现一个显示错误位置的链接。这将允许您找到错误的确切位置,并使用anyList.size()-1而不是anyList.size()。当我滚动到我的应用程序的recyclerview底部时,我的应用程序崩溃,错误位置是FetchData FetchData=fetchDataList.get(位置);尝试fetchDataList.get(位置-1),看看问题是否解决。否则,我不知道。