2012-01-05 2 views
1

J'ai défini un ArrayList dans ma classe principale où je suis le chargement des données à partir d'un flux XML et de créer différents onglets avec des activités différentes:Comment accéder (itérer?) Une ArrayList/Hashmap dans une autre classe?

static ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); 

Exemple d'où je mets une entrée de carte dans le ArrayList de HashMaps:

for (int i = 0; i < 10; i++) {  
    HashMap<String, String> map = new HashMap<String, String>(); 
    Element e = (Element)nodes.item(i); 
    map.put("id", XMLfunctions.getValue(e, "id")); 
    map.put("lat", "Lat: " + XMLfunctions.getValue(e, "lat")); 
    map.put("long", "Long: " + XMLfunctions.getValue(e, "long")); 
    mylist.add(map); 
} 

le premier onglet est un ListViewActivity et je suis en mesure de créer avec succès la liste en faisant référence à la liste de tableaux dans la classe principale: class.mylist via une liste Adaptateur:

ListAdapter adapter = new SimpleAdapter(
         ListViewActivity.this, 
         main.mylist, R.layout.list, 
         new String[] { "id", "lat", "long" }, 
         new int[] { R.id.item_id, R.id.item_lat, R.id.item_long });     
setListAdapter(adapter); 

Mon deuxième onglet est un MapView et je suis en mesure de passer avec succès les onglets, afficher la carte dans le mise en page de l'onglet et panoramique & zoom, etc.

Là où je besoin d'aide est à comprendre comment accéder au « lat 'et' longues 'chaînes dans le "mylist" ArrayList/Hashmap dans la classe principale (Note: J'ai déclaré ArrayList/Hashmap dans la classe principale, puis le partager à travers toutes les activités car il s'agit d'un flux XML assez volumineux et je ne voulais pas recharger des données ou avoir trop d'objets en mémoire).

Mon objectif est ensuite de convertir ces coordonnées lat/long en coordonnées géographiques et de les afficher en utilisant une superposition de cartes; Je suis déjà capable de le faire en utilisant des GeoPoints fixes codés en dur dans ma classe d'activité Carte. Cependant, comme je l'ai écrit ci-dessus, je dois maintenant remplacer ces GeoPoints «fixes» et utiliser à la place le contenu de «mylist» ArrayList/Hashmap.

Je suis nouveau (< 1 mois d'expérience) à la programmation Java/Android, alors j'espère que tout cela a du sens? Et j'espère que quelqu'un sera en mesure d'expliquer/donner un exemple de la façon dont je peux accéder aux données ... J'ai essayé d'implémenter diverses mesures telles que 'itérations', mais cela ne fonctionne pas encore.

Répondre

0

Vous pouvez faire un certain nombre de choses. Votre flux pourrait être une variable statique. S'il était statique, vous pouviez y accéder depuis n'importe quel endroit en écrivant MyActivity.myList.

En outre, vous pouvez passer la chaîne XML via l'intention:

Intent i = new Intent(this, ActivityToLaunch.class); 
i.putExtra("xml", xml); 
startActivity(i); 

Et puis le récupérer avec:

String xml = getIntent().getExtras().getString("xml"); 

Une autre idée, si le fichier est vraiment grand, serait de sauver le fichier xml à la carte SD et le charger dans chaque activité.

Après avoir fait sur de ceux-ci, vous pouvez parcourir la liste de tableaux comme celui-ci

for(HashMap<String,String> map: myList) 

et itérer ensuite à travers chaque HashMap dans deux façons:

for(String s: map.keyset()) 

qui vous permettra d'obtenir la valeur par la clé, ou vous pouvez parcourir les valeurs directement comme ceci:

for(String s: map.values()) 
+0

Salut Joru, oui je l'avais déjà déclaré la « mylist » ArrayList comme une variable statique comme vous le suggérez - plutôt que de passer via une intention. Avec votre suggestion ci-dessus, j'ai maintenant réussi à itérer à travers le ArrayList et afficher toutes les données dans mes objets hashmap dans le Logcat. Cependant, après avoir récupéré les valeurs, je ne suis toujours pas clair comment accéder à une entrée spécifique comme id, lat ou long? (Désolé si ma question est très basique, mais comme je l'ai expliqué je suis très novice) – Kevin

+0

En regardant à nouveau votre code, vous voudrez peut-être définir une petite classe et utiliser une liste de cela au lieu d'utiliser hashmap. Une classe qui aurait les membres id, lat et long. http://kkrit.com/n/Java_1.6_Tutorial/java/javaOO/classes.html Voici un exemple de déclaration de classe. Pour accéder à lat, par exemple, comme vous l'avez maintenant, vous devez faire map.get ("lat") ;. – Joru

2

Si je comprends bien votre question, vous étiez à la recherche d'un moyen de itérer au cours de la ArrayList? Si oui, cet exemple devrait vous aider à démarrer:

Iterator itr = myList.iterator(); 
while (itr.hasNext()) { 
    HashMap<String, String> map = (HashMap<String, String>) itr.next(); 
    String lat = (String) map.get("lat"); 
    String lon = (String) map.get("long"); 
    String id = (String) map.get("id"); 
    Log.d(TAG, "Lat is: " +lat); 
    Log.d(TAG, "Lon is: " +lon); 
    Log.d(TAG, "ID is: " +id); 
} 
+0

Salut Marvin - cela a fonctionné parfaitement, merci beaucoup pour la réponse rapide! – Kevin

+0

cela fonctionne parfaitement, mais petit problème que j'ai changer dans mon code map.get (lat); , map.get (long); map.get (id) puis son homme de travail., j'ai voté u thax –

Questions connexes