Devrais-je mettre ça: ?Code:return maListe.size();
EDIT: Effectivement c'est ça, je vous remercie beaucoup à tousCode:
1
2 return (maListe.size())/7;
Version imprimable
Devrais-je mettre ça: ?Code:return maListe.size();
EDIT: Effectivement c'est ça, je vous remercie beaucoup à tousCode:
1
2 return (maListe.size())/7;
J'ai résolu le problème, j'ai fait un Edit sur le poste concerné. Mais je te remercie.
Cependant j'ai un problème. La taille de mon Array est de 14 (7 infos par items), les 7 premiers (de 0 à 6 doivent donc aller dans le premier item) et les 7 derniers (de 7 à 13 donc dans le deuxième item). Le problème c'est que le deuxième item est crée position est incrémenté de 1 alors que dans mon cas il devrait être de 7, il me prend donc deux fois les mêmes informations pour les deux items.
Voici le code de mon Adapter:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub LinearLayout layoutItem; //(1) : Réutilisation des layouts if (convertView == null) { //Initialisation de notre item à partir du layout XML "personne_layout.xml" layoutItem = (LinearLayout) mInflater.inflate(R.layout.affichageitembis, parent, false); } else { layoutItem = (LinearLayout) convertView; } //(2) : Récupération des TextView de notre layout TextView tv_Nom = (TextView)layoutItem.findViewById(R.id.nom); TextView tv_Adresse = (TextView)layoutItem.findViewById(R.id.adresse); TextView tv_CP = (TextView)layoutItem.findViewById(R.id.CP); TextView tv_Ville = (TextView)layoutItem.findViewById(R.id.ville); TextView tv_PrixMoyen = (TextView)layoutItem.findViewById(R.id.prixMoyen); TextView tv_Distance = (TextView)layoutItem.findViewById(R.id.distance); TextView tv_Salut = (TextView)layoutItem.findViewById(R.id.distance); //(3) : Renseignement des valeurs tv_Nom.setText(maListe.get(position)); position++; tv_Adresse.setText(maListe.get(position)); position++; tv_CP.setText(maListe.get(position)); position++; tv_Ville.setText(maListe.get(position)); position++; tv_PrixMoyen.setText(maListe.get(position)); position++; tv_Distance.setText(maListe.get(position)); position++; tv_Salut.setText(maListe.get(position)); position++; /*//(4) Changement de la couleur du fond de notre item if (mListP.get(position).genre == Personne.MASCULIN) { layoutItem.setBackgroundColor(Color.BLUE); } else { layoutItem.setBackgroundColor(Color.MAGENTA); }*/ //On retourne l'item créé. return layoutItem; }
L'ArrayList ne doit pas fonctionner comme ça.
Un Objet dans la liste doit contenir toutes les infos pour créer une ligne.
Ton ArrayList doit contenir 2 objets.
C'est une ArrayList de quoi ?
T'as une classe avec toutes les infos ?
Tu peux faire un truc tout pourri du genre :
ArrayList <HashMap <String, String>>
Mais bon à la base t'as pas un JSONArray de JSONArray ?
Envois le gros JSONArray et chaque JSONArray permet de faire une ligne.
C'est une ArrayList<String>.
En faite pour le moment je fais ça:
donnees étant une ArrayList.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 //recuperation des donnees json try{ JSONArray jArray = new JSONArray(result); for(int i=0;i<jArray.length();i++) { json_data = jArray.getJSONObject(i); donnees.add(json_data.getString("name")); donnees.add(json_data.getString("adresse")); donnees.add(json_data.getString("CP")); donnees.add(json_data.getString("ville")); donnees.add(json_data.getString("average_price")); donnees.add(json_data.getString("long")); donnees.add(json_data.getString("lat")); } }
Ok ben c'est bien ce que je dis :
jArray c'est le gros JSONArray qui contient des JSONArray : json_data.
Donc jArray contient plusieurs json_data.
Tu n'as qu'a envoyé jArray à ton Adapter.
La taille ce sera jArray.length() donc 2.
Et dans getView tu feras :
Et là t'as toutes tes String :Code:json_data = jArray.getJSONArray(position);
adresse
CP
ville
average_price
long
lat
Essayez pas de faire compliquer.
T'as un JSONArray de JSONArray à partir de là c'est fini.
Ok je te remercie, je vais tenter ça alors
Non pis une ArraList <String> ça fait que tu construis une ligne avec une String.
Dans l'exemple qu'on t'as donné c'était une ArrayList <Personne>.
Dans une instance de la classe Personne il y avait toutes les infos nécessaire à la construction d'une ligne.
T'aurais pu faire des trucs relativement sale :
Mais bon c'est pas la peine, t'as déjà tout.Code:
1
2 ArrayList <ArrayList <String>> ArrayList <HashMap <String,String>>
C'est juste ce que je suis entrain de faire ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 public class AdapterPersoSurPlace extends BaseAdapter { private JSONArray maListe; private Context mContext; private LayoutInflater mInflater; Typeface verdana; private float longFloat; private float latFloat; private float resultat; private String resultatString; Location locationRestaurant = new Location("Restaurant"); Location locationDetecter = new Location("Detecter"); Float longitude; Float latitude; private int km = 0; JSONArray json_data=null; public AdapterPersoSurPlace (Context context, JSONArray jArray, Location detecte, Float lg, Float lt) { mContext = context; maListe = jArray; mInflater = LayoutInflater.from(mContext); verdana = Typeface.createFromAsset(mContext.getAssets(), "verdana.ttf"); locationDetecter = detecte; longitude = lg; latitude = lt; } public int getCount() { return maListe.length(); // TODO Auto-generated method stub } public Object getItem(int position) { // TODO Auto-generated method stub try { return maListe.get(position); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return position; } public long getItemId(int position) { // TODO Auto-generated method stub return (position); } public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub LinearLayout layoutItem; //(1) : Réutilisation des layouts if (convertView == null) { //Initialisation de notre item à partir du layout XML "personne_layout.xml" layoutItem = (LinearLayout) mInflater.inflate(R.layout.affichageitembis, parent, false); } else { layoutItem = (LinearLayout) convertView; } json_data = maListe.getJSONArray(position); //(2) : Récupération des TextView de notre layout TextView tv_Nom = (TextView)layoutItem.findViewById(R.id.nom); TextView tv_Adresse = (TextView)layoutItem.findViewById(R.id.adresse); TextView tv_CP = (TextView)layoutItem.findViewById(R.id.CP); TextView tv_Ville = (TextView)layoutItem.findViewById(R.id.ville); TextView tv_PrixMoyen = (TextView)layoutItem.findViewById(R.id.prixMoyen); TextView tv_Distance = (TextView)layoutItem.findViewById(R.id.distance); //(3) : Renseignement des valeurs tv_Nom.setText((CharSequence) json_data.get(position)); position++; tv_Adresse.setText((CharSequence) json_data.get(position)); position++; tv_CP.setText((CharSequence) json_data.get(position)); position++; etc..........
Apparemment dans le getView tu fais n'importe quoi.
Tu récupères des String avec une position que t’incrémente alors que tu faisais comme ça avant :
A vu d’œil tu devrais faire :Code:
1
2
3
4
5
6
7 json_data.getString("name"); json_data.getString("adresse"); json_data.getString("CP"); json_data.getString("ville"); json_data.getString("average_price"); json_data.getString("long"); json_data.getString("lat");
Code:tv_Nom.setText(json_data.getString("name"));
C'est bien ce que je pensais mais Eclispe n'aime pas:
Il me propose de remplacer getString par optString, toSring ou getLong...Code:
1
2 tv_Nom.setText(json_data.getString("name"));
EDIT: je pense que c'est bon s'était un problème de type de json_data je pense
Ah oui flute c'est un JSONObject pas un JSONArray...
Désolé.
Oui ça n'existe pas
Par contre :Code:JSONArray.getString(String name);
Ça existe.Code:
1
2 JSONObect.getString(String name); JSONArray.getString(int position);
Oui t'as un JSONArray de JSONObject.
Pas grave lol tu m'aides déjà suffisement, je tolère donc tes erreurs :)
Maintenant j'ai un FC à cause d'un pointeur null à la ligne 59:
Voici l'erreur:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 package com.restomaniak.alpha; import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import android.graphics.Typeface; import android.location.Location; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.TextView; public class AdapterPersoSurPlace extends BaseAdapter { private JSONArray maListe; private Context mContext; private LayoutInflater mInflater; Typeface verdana; private float longFloat; private float latFloat; private float resultat; private String resultatString; Location locationRestaurant = new Location("Restaurant"); Location locationDetecter = new Location("Detecter"); Float longitude; Float latitude; private int km = 0; JSONObject json_data=null; public AdapterPersoSurPlace (Context context, JSONArray jArray, Location detecte, Float lg, Float lt) { mContext = context; maListe = jArray; mInflater = LayoutInflater.from(mContext); verdana = Typeface.createFromAsset(mContext.getAssets(), "verdana.ttf"); locationDetecter = detecte; longitude = lg; latitude = lt; } public int getCount() { return maListe.length(); // TODO Auto-generated method stub } public Object getItem(int position) { // TODO Auto-generated method stub try { return maListe.get(position); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return position; } public long getItemId(int position) { // TODO Auto-generated method stub return (position); } public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub LinearLayout layoutItem; //(1) : Réutilisation des layouts if (convertView == null) { //Initialisation de notre item à partir du layout XML "personne_layout.xml" layoutItem = (LinearLayout) mInflater.inflate(R.layout.affichageitembis, parent, false); } else { layoutItem = (LinearLayout) convertView; } //(2) : Récupération des TextView de notre layout TextView tv_Nom = (TextView)layoutItem.findViewById(R.id.nom); TextView tv_Adresse = (TextView)layoutItem.findViewById(R.id.adresse); TextView tv_CP = (TextView)layoutItem.findViewById(R.id.CP); TextView tv_Ville = (TextView)layoutItem.findViewById(R.id.ville); TextView tv_PrixMoyen = (TextView)layoutItem.findViewById(R.id.prixMoyen); TextView tv_Distance = (TextView)layoutItem.findViewById(R.id.distance); //(3) : Renseignement des valeurs try { json_data = maListe.getJSONObject(position); tv_Nom.setText(json_data.getString("name")); tv_Adresse.setText(json_data.getString("adresse")); tv_CP.setText(json_data.getString("CP")); tv_Ville.setText(json_data.getString("ville")); tv_PrixMoyen.setText(json_data.getString("average_price")); longFloat = Float.parseFloat(json_data.getString("long")); latFloat = Float.parseFloat(json_data.getString("lat")); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
http://www.restomaniak.com/media/CaptureJson.PNG
T'es sûre que tu n’envoies pas un JSONArray null quand tu créer ton AdapterPersoSurPlace ?
On dirait qu'il n'est pas remplit.
J'ai trouvé, donc mon activité j'ai déclaré ça tout en haut du code:
et après dans le try au lieu de faire:Code:
1
2JSONArray jArray = null;
j'ai fait:Code:
1
2 jArray = new JSONArray(result);
Donc au moment de faire:Code:
1
2 JSONArray jArray = new JSONArray(result);
Il prenait le jArray déclaré en globale... Boulet tour!!! J'assumeCode:
1
2
3
4
5
6
7
8
9 AdapterPersoSurPlace adapterProut = new AdapterPersoSurPlace(this, jArray, locationDetecter, longFloat, latFloat); //Récupération du composant ListView ListView list = (ListView)findViewById(R.id.listResto); //Initialisation de la liste avec les données list.setAdapter(adapterProut);
Va dans les préférences de ton IDE et cherche quelque chose comme "local variable masking class variable" / "variable locale masquant une variable de class", puis active le warning.
En fait, fais un tour dans les préférences et active tout les warning qui pourraient t'être utile.
Je n'arrive pas à mettre la main dessus, c'est ou dans les préférenes, car je suis dans Windows -> Préférences mais je trouve pas
Le temps que je rallume mon vieil Eclipse :aie:
Window -> Preferences -> Java -> Compiler -> Error/warning
Le warning dont je parle est dans la catégorie "Name shadowing and conflicts".
Ps : la recherche avec "warning" donne directement l'arbo, de même qu'avec "local".
Ps ² : j'ai uniquement un Eclipse en anglais, je te laisse faire les transpositions en français :)
Je vais m'en sortir ;), merci beaucoup.
J'ai une question autre (enfin autre que les warnings, elle rentre dans le cadre du Topic). J'ai donc géré mes LIstView avec des adapters, mais maintenant bien évidemment ce bout de code:
Ne fonctionne plus dans l'activité principale et j'avoue que je ne sais pas trop comment le géré du coup.Code:
1
2
3
4
5
6
7
8 //On met un écouteur d'évènement sur notre listView list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @SuppressWarnings("unchecked") public void onItemClick(AdapterView<?> a, View v, int position, long id) { });
Ceci étant le code au dessus qui se trouve au dessus de l'évènement:
Code:
1
2
3
4
5
6
7
8
9
10 //donnees est une ArrayList //Création et initialisation de l'Adapter pour les personnes AdapterPersoLivraison adapterProut = new AdapterPersoLivraison(this, donnees); //Récupération du composant ListView ListView list = (ListView)findViewById(R.id.listResto); //Initialisation de la liste avec les données list.setAdapter(adapterProut);
T'es sûre que ton OnItemClickListener ne fonctionne pas ?
Mais un System.out.println ou un Log.e pour voir si la méthode onItemClick est bien appelé.
Je ne vois pas pourquoi elle ne serait pas appelé.