0

J'ai un problème avec ma vue recycleur ou plus précisément avec une arrayliste secondaire utilisée pour définir une valeur dans chaque viewholder.L'arrayliste de Recyclerview lève une exception outofbounds dans android

J'ai une liste d'éléments envoyés à mon adaptateur et dans son constructeur je crée un arrayliste de la taille de cette liste. Une liste d'éléments fonctionne correctement, mais la deuxième liste d'entiers contenant tous les nombres indique les limites. Un logd rapide montre des thats pas le cas et qu'il ya une liste de 1 est là, mais chaque fois que j'essaie d'accéder à ce son outofbounds à l'index 0.

classe def

RecyclerView recyclerView; 
ItemAdapter itemAdapter; 
List<Item> items; 
List<Boolean> itemsSelected; 
List<Integer> quantities; 

OnCreate

quantities = new ArrayList<>(); 

méthode pour créer la liste d'articles à l'adaptateur et à créer également la liste des longueurs égales de 1 de

for (int i = 0; i <categories.size() ; i++) { 
       long length = dataSnapshot.child(categories.get(i)).getChildrenCount(); 
       Iterator<DataSnapshot> toAdd= dataSnapshot.child(categories.get(i)).getChildren().iterator(); // this returns all the items in each category 
       for (int j = 0; j <length ; j++) { 
        DataSnapshot newData = toAdd.next(); 
        items.add(newData.getValue(Item.class)); 
        //quantities.add(Integer.valueOf(1)); 
        //itemsSelected.add(Boolean.valueOf(false)); 
        Log.d(TAG, "onDataChange: debug: "+ newData.toString()); 

       } 


      } 
      for (int i = 0; i < items.size() ; i++) { 
       quantities.add(i,Integer.valueOf(1)); 
       itemsSelected.add(i,Boolean.valueOf(false)); 
      } 
      itemAdapter = new ItemAdapter(items); 
      itemAdapter.notifyDataSetChanged(); 

Dans le code ci-dessus les deux lignes commentées sont une autre tentative de création d'une liste de celles mais il a également eu la même erreur donc je l'ai déplacé à un tas d'autres endroits.

Je fais aussi la même chose ici dans le constructeur de l'adaptateur

public ItemAdapter(List<Item> items){ 
     this.items = items; 
     for (int i = 0; i < items.size() ; i++) { 
      quantities.add(i,Integer.valueOf(1)); 
      itemsSelected.add(i,Boolean.valueOf(false)); 
      Log.d(TAG, "ItemAdapter: quan "+ quantities.get(i)); 
      Log.d(TAG, "ItemAdapter: bool "+ itemsSelected.get(i)); 
     } 

LOGD montre le placement sortie du journal typique

ItemAdapter: quan 1 
bindItem: quan [1, 1, 1, 1, 1, 1, 1, 1] 

Qu'est-ce que je fais mal. La liste existe même lors de la liaison d'un item parce que si je loge toute la liste au lieu d'un seul index, toute la liste est sortie mais get (index) provoque des outofbounds.

Merci d'avoir pris le temps de regarder cela.

EDIT: Code adaptateur

private class ItemAdapter extends RecyclerView.Adapter<ItemHolder>{ 
    List<Item> items; 
    Item item; 

    public ItemAdapter(List<Item> items){ 
     this.items = items; 
     for (int i = 0; i < items.size() ; i++) { 
      quantities.add(i,Integer.valueOf(1)); 
      itemsSelected.add(i,Boolean.valueOf(false)); 
      Log.d(TAG, "ItemAdapter: quan "+ quantities.get(i)); 
      Log.d(TAG, "ItemAdapter: bool "+ itemsSelected.get(i)); 
     } 
    } 

    @Override 
    public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater layoutInflater = LayoutInflater.from(getActivity()); 
     View view= layoutInflater.inflate(R.layout.singleitem,parent,false); 
     return new ItemHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ItemHolder holder, int position) { 
     item = items.get(position); 
     holder.bindItem(item,position); 
    } 

    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 


} 
+0

pouvez-vous poster votre code adaptateur – MadScientist

+0

vient de l'ajouter pour vous – ah4444

Répondre

0

Comment accédez-vous à la liste quantities dans votre adaptateur? Pour résoudre ce problème, vous pouvez passer la liste des quantités dans le constructeur de l'adaptateur, puis appeler la méthode notifyDataSetChanged(), après avoir ajouté des valeurs aux deux listes (n'oubliez pas d'ajouter & pour ne pas réinitialiser la liste). Cela garantirait que les deux listes sont mises à jour avec l'adaptateur.

Juste un petit doute. Pourquoi définissez-vous une boucle for à l'intérieur d'un contructor. Que comptez-vous réaliser?

+0

Salut merci pour la réponse. La boucle for est là parce que j'essayais de découvrir ce qui ne va pas. Il est supposé définir les quantités à la longueur exacte comme la liste des éléments. J'accède aux quantités dans l'adaptateur en le déclarant dans la classe fragment. Je vais essayer votre solution de créer les deux listes d'abord et ensuite les passer à l'adaptateur et revenir vers vous avec le résultat, même si je pense que ive essayé avant. la raison de ceci est parce que quand je souligne un article dans le viewholder tous les articles correspondants avec cette vue sont soulignent ainsi im im essayant de dépister cela avec ces listes – ah4444

+0

Il d'autres vues sont allumées. Alors cela n'a rien à voir avec vos listes. Cochez [this] (http: // stackoverflow.com/questions/34552070/dynamic-ajout-views-dans-un-recycleless-only-to-current-item/42482524 # 42482524) poste de pile! – MadScientist

+0

Salut merci pour votre aide. J'ai mis les listes dans l'adaptateur en les créant au même endroit et en les transmettant. Comme pour les autres vues, j'ai vérifié le lien, mais j'ai fini par continuer ainsi. L'objectif des listes était de garder une trace de ce qui a été sélectionné de sorte que lorsque je fais défiler la liste, la sélection persiste. n'était pas sûr si onViewRecycled persisterait – ah4444