-3
votes

Recyclerview - java.lang.indexoutofboundSException: index non valide 1, la taille est 0

Dans mon application, je souhaite afficher 2 députés différents avec 2 données de liste de matrices dans l'adaptateur .Mais lors de l'exécution, je reçois cette erreur.

java.lang.indexoutofboundSException: Index: 1, Taille: 0 à java.util.arraylist.get (arraylist.java:411) à gjteamcom.doubleteam.cariadapter.onbindviewholder (Cariadapter.java:58) à android.support.v7.widget.recyclerview $ adapter.onbindviewholder (recyclerview.java:6781) à android.support.v7.widget.recyClerview $ adapter.bindviewholder (recyclerview.java:6823) à android.support.v7.widget.recyClerview $ recycler.tryBindviewholderbydeadline (recyclerview.java:5752) à android.support.v7.widget.recyCllerview $ recycler.ecteurGetviewholderforPlydeAdleLine (recyclerview.java:6019) à android.support.v7.widget.recyCLERVIEW $ RECYCLER.GETVIEWFORPOSITION (RECYCLERVIEW.JAVA:5858) à android.support.v7.widget.recyCLERVIEW $ RECYCLER.GETVIEWFORPOSITION (RECYCLERVIEW.JAVA:5854) à Android.Support.v7.widget.LinearLayOutManager $ LayoutState.next (linearlayoutManager.java:2230) à android.support.v7.widget.linearlayoutmanager.layoutchunk (linearlayoutManager.java:1557) à android.support.v7.widget.linearlayoutmanager.fill (linearlayoutManager.java:1517) à android.support.v7.widget.linearlayoutmanager.onlayoutTchildren (linearlayoutManager.java:612) à android.support.v7.widget.recyclerview.dispatchlayoutStep2 (recyclerview.java:3924) à Android.Support.v7.widget.RecyCLERVIEW.DISPATCHLAYOUT (RECYCLERVIEW.JAVA:3641) à android.support.v7.widget.recyClerview.onlayout (recyclerview.java:4194) à Android.View.View.layout (vue.java:17838) à Android.View.Viewgroup.Layout (Viewgroup.java:5754) à android.widget.linearlayout.setchildframe (linearlayout.java:1982) à android.widget.linearlayout.layouetvertical (linearlayout.java:1826) à android.widget.linearlayout.onlayout (linearlayout.java:1735) à Android.View.View.layout (vue.java:17838) à Android.View.Viewgroup.Layout (Viewgroup.java:5754) à android.support.constraint.constraintLayLayOnt.onlayout (contraintlayout.java:1915) à Android.View.View.layout (vue.java:17838) à Android.View.Viewgroup.Layout (Viewgroup.java:5754) à android.widget.frameLayout.layoutchildrren (Framelayout.java:383) à android.widget.framelayout.onlayout (framelayout.java:321) à Android.View.View.layout (vue.java:17838) à Android.View.Viewgroup.Layout (Viewgroup.java:5754) à android.widget.linearlayout.setchildframe (linearlayout.java:1982) à android.widget.linearlayout.layouetvertical (linearlayout.java:1826) à android.widget.linearlayout.onlayout (linearlayout.java:1735) à Android.View.View.Layout (View.java:17838) P> BlockQuote>

Voici mon adaptateur: P>

public class CariAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

Context context;
ArrayList<Cari> cari;
ArrayList<CariP> carip;
public CariAdapter(Context c, ArrayList<Cari> p, ArrayList<CariP> pp)
{
    context = c;
    cari = p ;
    carip = pp;

}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    switch (i) {
        case 0:
            return new CariViewHolder(LayoutInflater.from(context).inflate(R.layout.cv_cari,viewGroup,false));
        case 2:
            return new CariPViewHolder(LayoutInflater.from(context).inflate(R.layout.cv_carip,viewGroup,false));

            default:
                return null;
    }

}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
    switch (viewHolder.getItemViewType()) {
        case 0:
            CariViewHolder cariViewHolder = (CariViewHolder) viewHolder;
            cariViewHolder.timnama.setText(cari.get(i).getTim_nama());
            cariViewHolder.timkat.setText(cari.get(i).getTim_kategori());
            Picasso.get().load(cari.get(i).getTim_image()).resize(200,200).into(cariViewHolder.timimg);
            break;

        case 2:
            CariPViewHolder cariPViewHolder = (CariPViewHolder) viewHolder;
            cariPViewHolder.akunanama.setText(carip.get(i).getAkun_nickname());
            cariPViewHolder.akuninterest.setText(carip.get(i).getAkun_interest());
            Picasso.get().load(carip.get(i).getAkun_profilimage()).resize(200,200).into(cariPViewHolder.akunimg);
            break;

            default:

    }
}

@Override
public int getItemViewType(int position) {
    return position % 2 * 2;
}

@Override
public int getItemCount() {
    return cari.size()+carip.size();

}

class CariViewHolder extends RecyclerView.ViewHolder
{
    TextView timnama,timkat;
    ImageView timimg;
    public CariViewHolder(@NonNull View itemView) {
        super(itemView);
        timnama = itemView.findViewById(R.id.txt_cvnamacari);
        timkat = itemView.findViewById(R.id.txt_cvkategori);
        timimg = itemView.findViewById(R.id.img_cvcari);
    }
}

class CariPViewHolder extends RecyclerView.ViewHolder
{
    TextView akunanama,akuninterest;
    ImageView akunimg;
    public CariPViewHolder(@NonNull View itemView) {
        super(itemView);
        akunanama = itemView.findViewById(R.id.txt_cvpnamacari);
        akuninterest = itemView.findViewById(R.id.txt_cvpinterest);
        akunimg = itemView.findViewById(R.id.img_cvpcari);

    }
}}


3 commentaires

Votre liste de Cari et de votre carrip a-t-elle toujours la même taille?


Non, je pense qu'ils ont une taille différente, car ils sont les enfants de ma base de données (Firebase) et je souhaite l'afficher à mon application avec RecyclerView


Vous devez indexer vos listes correctement


3 Réponses :


0
votes

En supposant que les deux tableaux ont la même taille. Ensuite, vous devez obtenir la bonne position pour obtenir des données de votre tableau. I ICI représente la position de votre article de vue de recyclage mais pas la position de votre article de votre tableau Voici la fonction OnBindView

@Override
public void onBindViewHolder(@NonNull 
RecyclerView.ViewHolder viewHolder, int i) {
switch (viewHolder.getItemViewType()) {
        case 0:
            CariViewHolder cariViewHolder = (CariViewHolder) viewHolder;
            cariViewHolder.timnama.setText(cari.get(i/2).getTim_nama());
            cariViewHolder.timkat.setText(cari.get(i/2).getTim_kategori());
            Picasso.get().load(cari.get(i/2).getTim_image()).resize(200,200).into(cariViewHolder.timimg);
            break;

        case 2:
            CariPViewHolder cariPViewHolder = (CariPViewHolder) viewHolder;
            cariPViewHolder.akunanama.setText(carip.get(i/2).getAkun_nickname());
            cariPViewHolder.akuninterest.setText(carip.get(i/2).getAkun_interest());
            Picasso.get().load(carip.get(i/2).getAkun_profilimage()).resize(200,200).into(cariPViewHolder.akunimg);
            break;

            default:

    }
}


1 commentaires

Hey, j'essaie de réparer à .get (i) à Onbindview comme vous avez dit. Mais j'ai toujours eu une erreur. java.lang.indexoutofboundSException: Index: 3, Taille: 3



0
votes

Il y a deux endroits où votre code provoque des problèmes.

  1. Il existe une hypothèse implicite que cari.size () == carip.size () ou cari.size () = carip.size () + 1 . Vous connaissez peut-être cela. Je viens d'ajouter cela pour vous assurer de savoir à ce sujet.

  2. in Onbindviewholder , vous ne pouvez pas utiliser directement (la position) directement. Considérez le cas lorsque CARI a le contenu C 0 , C 1 et CARIP Content P 0 < / sub>.

    Les positions ( i s) associées à chaque élément seront: C 0 : 0, p 0 : 1 et C 1 : 2.

    Vous pouvez voir le problème maintenant. Ici, carip.size () == 1 ce qui signifie que son indice maximum sera 0. mais la position ( i ) utilisée dans onbindvieholder sera être 1. Ce qui est hors limites.

    Vous devez remplacer les emplacements de i par i / 2 dans onbindviewholder . .

    qui aboutira à la nouvelle association: C 0 : 0, P 0 : 0 et C 1 : 1 ce qui est exactement quoi Vous voulez


1 commentaires

J'ai toujours eu une extraction index de l'erreur d'erreur. J'apprécie votre réponse, mais je ne comprends toujours pas comment cette méthode getitemCount () fonctionne dans 2 tailles de arraylist.



0
votes

Vous avez un malentendu sur l'utilisation de différents vitypes. Votre problème est cette fonction xxx

Vous devez avoir un élément de liste unique contenant ViewType et modèle. vous suggère de lire ce article et voir comment créer itemModel

C'est difficile à expliquer sur votre code mais ne soyez pas timide pour poser la question que je répondrai et vous aide


0 commentaires