J'ai un Adaptateur: strong> P> 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>.
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)
7 Réponses :
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 code>. P>.
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) code> ne doit pas causer
nullpointException code>.
in Je vous suggère d'ajouter une méthode: p> 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.
public void addAllTransaction(List<Farmer> farmerList) {
farmeritems.addAll(farmerList);
notifyDataSetChanged();
}
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);
Peut-être Vous devriez changer le code dans votre constructeur pour: p>
Modifier le code dans votre méthode et enfin changer le code dans votre méthode J'espère que cela résoudra votre problème. P> Farmeritems code> 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. P>
agricultems = nouvelle arrayliste
PublishResults code> à: p>
fermierems = Nouvelle ArrayList
setTransactionList code> à: p>
agricultems = nouvelle arrayliste
regarde votre code ce que vous faites: strong> p> à l'intérieur de votre ceci ajoutera setTransactionList code> Vous êtes re -Références de votre
Farmeritems code> IE Après avoir appelé
FarmeriTems = NewList Code>, votre
Farmeritems CODE> a une référence de
NewList code> qui n'a que 3 articles. P>
nouvelleliste code> (3 éléments) dans votre
agricultems code>. Maintenant, votre
Farmeritems code> est mis à jour. P> p>
Essayez ceci: Votre tableau est limité à 3, ce qui signifie que si vous essayez d'obtenir élément [3] code> lancera un
ArrayindexoutofboundSException code> parce que c'est en fait le 4ème élément. Les articles sont comptés par le système de
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> i Utilisez Lorsque j'ai fait modifier des données, il est temps d'attribuer des données à productemp code> quand je Voulez-vous modifier ou modifier les données. p>
productemp.add (nouveau produit ()); code> ou
productemp.remove (0); code> p>
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();
Dans votre analyse d'asynctaque Où est la liste code> La variable code> est déclarée, qui est utilisée dans
list.add (FarmerDétails); code> Veuillez spécifier, ce que vous faites à l'intérieur
OnloadMorecomplete ( ) code> méthode.
S'il vous plaît montrer où avez-vous déclaré et initialisez la liste
code> et
offset code>