7
votes

Obtenir l'index de l'array hors des limites lors de l'ajout de nouveaux éléments à la liste lors du défilement

J'ai un listview code> dans lequel je charge des données de sqlite en définissant une limite de 3 données de SQLite lors du défilement de la liste que j'ai utilisé asynctack code> pour charger 3 autres données Dans la base de données, mais lorsque les nouvelles données sont chargées, cela me montre une erreur: arrayindexoutofboundSException code>.

Adaptateur: strong> P>

java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:7103)
at android.widget.ListView.layoutChildren(ListView.java:1653)
at android.widget.AbsListView.onLayout(AbsListView.java:2230)
at android.view.View.layout(View.java:16001)
at android.view.ViewGroup.layout(ViewGroup.java:5181)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1195)
at android.view.View.layout(View.java:16001)


2 commentaires

Dans votre analyse d'asynctaque Où est la liste La variable est déclarée, qui est utilisée dans list.add (FarmerDétails); Veuillez spécifier, ce que vous faites à l'intérieur OnloadMorecomplete ( ) méthode.


S'il vous plaît montrer où avez-vous déclaré et initialisez la liste et offset


7 Réponses :


1
votes

Si vous limitez le nombre de lignes à 3 à 3, le dernier index sera 2. Donc, si vous essayez d'obtenir par l'index 3, vous obtiendrez NullPointerException . .


3 commentaires

Il suffit de regarder ma question éditée où j'ai inclus la structure de la table aussi dans ma requête sélectionnée que j'ai utilisée sélectionnée * à partir de laquelle retourne toutes les lignes de la table pour obtenir uniquement le nom de la ferme, Mobileno et l'emplacement que j'ai utilisé Cursor.Getstring (1) Pour obtenir un nom de ferme, Cursor.Getstring (2) pour obtenir Mobileno et Cursor.Getstring (3) pour obtenir l'emplacement


Comment mettre à jour la valeur de décalage une fois que la tâche ASYNC est terminée


"Donc, si vous essayez d'obtenir par l'index 3, vous obtiendrez NullPointerException." Comme vous pouvez le constater de la réponse éditée, il y a 4 champs de table. Donc, getstring (3) ne doit pas causer nullpointException .



0
votes

in SetTransactionListList Code> Méthode Vous remplacez la liste de données existante ( code>) avec un nouvel objet et après cet appel notifydatasetched () code>. Éventuellement, une exception se produit entre ces appels, vous avez donc remplacé le jeu de données, mais RecyclERView tente d'accéder aux données par index de l'ancien objet.

Je vous suggère d'ajouter une méthode: p>

public void addAllTransaction(List<Farmer> farmerList) {
  farmeritems.addAll(farmerList);
  notifyDataSetChanged();
}


0 commentaires

0
votes

Si vous obtenez une erreur lors de la récupération des données de l'objet Cursor, vous devez utiliser le nom de la colonne au lieu de passer 1, 2 3. Vous utilisez un index de colonne de code rigide pour obtenir la valeur que vous devez utiliser des noms de colonne pour obtenir l'index de colonne comme ci-dessous Code suivant:

 Farmer farmerdetails = new Farmer();
            farmerdetails.setFarmername(cursor.getString(cursor.getColumnIndex(FARMER_NAME)));
            farmerdetails.setFarmermobno(cursor.getString(cursor.getColumnIndex(FARMER_MOBNO )));
            farmerdetails.setFarmerlocation(cursor.getString(cursor.getColumnIndex(FARMER_LOCATION )));
            farmerlabels.add(farmerdetails);


0 commentaires

0
votes

Peut-être Farmeritems est manipulé en dehors de la classe FarmerAdapter. Une façon d'empêcher que cela crée une nouvelle arraylist au lieu de la référer.

Vous devriez changer le code dans votre constructeur pour:

agricultems = nouvelle arrayliste (Liste);

Modifier le code dans votre méthode PublishResults à:

fermierems = Nouvelle ArrayList ((ArrayList ) Résultats.values);

et enfin changer le code dans votre méthode setTransactionList à:

agricultems = nouvelle arrayliste (nouvelle liste);

J'espère que cela résoudra votre problème.


0 commentaires

0
votes

regarde votre code xxx

ce que vous faites:

à l'intérieur de votre setTransactionList Vous êtes re -Références de votre Farmeritems IE Après avoir appelé FarmeriTems = NewList , votre Farmeritems a une référence de NewList qui n'a que 3 articles.

Ce que vous devriez faire: xxx

ceci ajoutera nouvelleliste (3 éléments) dans votre agricultems . Maintenant, votre Farmeritems est mis à jour.


0 commentaires

0
votes

Essayez ceci: xxx

Votre tableau est limité à 3, ce qui signifie que si vous essayez d'obtenir élément [3] lancera un ArrayindexoutofboundSException parce que c'est en fait le 4ème élément. Les articles sont comptés par le système de N-1 (0,1,2) pour les 3 éléments.


0 commentaires

0
votes

Ma meilleure pratique d'utilisation de l'adaptateur pour ListView et RecyclERView, Je sépare les données en deux types. Un pour une utilisation temporaire et une autre pour la finale utilisée.

Exemple: strong> p> xxx pré>

i Utilisez productemp code> quand je Voulez-vous modifier ou modifier les données. p>

productemp.add (nouveau produit ()); code> ou productemp.remove (0); code> p>

Lorsque j'ai fait modifier des données, il est temps d'attribuer des données à ProduitsFinal code> utilisé par l'adaptateur. Ensuite, je peux effacer les données dans productemp code> pour enregistrer la mémoire. P>

ProductAdapter adapter = new ProductAdapter(productsFinal);
productsView.setAdapter(adapter);
...
productsFinal.addAll(productsTemp);
productsTemp.clear();
adapter.notifyDataSetChanged();


0 commentaires