Ошибка при выборке индекса позиции данных 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.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==0amp;amp; 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, размер 21. Пожалуйста, скажите мне, какие изменения я должен внести, чтобы мой код заработал.

Ответ №1:

Трудно найти проблему без вашего полного кода, но я думаю, вы должны проверить все anyList.size() , имея в виду следующее: поскольку индекс списка и массива начинается с 0, индекс их последнего элемента anyList.size()-1 .

Комментарии:

1. Какую часть кода вы хотите решить проблему??

2. Когда это приложение выходит из строя, вы можете открыть вкладку «Выполнить» в нижней части окна Android Studio, и там есть ссылка, которая показывает местоположение ошибки при нажатии на нее. Это позволит вам найти точное местоположение ошибки и использовать AnyList.size()-1 вместо AnyList.size().

3. Когда я прокручиваю до нижней части recyclerview моего приложения, мое приложение выходит из строя, и местоположение ошибки — fetchData fetchData = fetchDataList.get (позиция);

4. Попробуйте fetchDataList.get (position-1) и посмотрите, решена ли проблема. в противном случае я понятия не имею.