11
votes

Android - MapView contenue dans une liste

Actuellement, j'essaie de placer un MAPView dans une liste de réception. Quelqu'un a-t-il eu un succès avec cela? Est-ce même possible? Voici mon code:

            ListView myList = (ListView) findViewById(android.R.id.list);
        List<Map<String, Object>> groupData = new ArrayList<Map<String, Object>>();

        Map<String, Object> curGroupMap = new HashMap<String, Object>();
        groupData.add(curGroupMap);
        curGroupMap.put("ICON", R.drawable.back_icon);
        curGroupMap.put("NAME","Go Back");
        curGroupMap.put("VALUE","By clicking here");

        Iterator it = data.entrySet().iterator();
        while (it.hasNext()) 
        {
            //Get the key name and value for it
            Map.Entry pair = (Map.Entry)it.next();
            String keyName = (String) pair.getKey();
            String value = pair.getValue().toString();

            if (value != null)
            {
                //Add the parents -- aka main categories
                curGroupMap = new HashMap<String, Object>();
                groupData.add(curGroupMap);

                //Push the correct Icon
                if (keyName.equalsIgnoreCase("Phone"))
                    curGroupMap.put("ICON", R.drawable.phone_icon);
                else if (keyName.equalsIgnoreCase("Housing"))
                    curGroupMap.put("ICON", R.drawable.house_icon);
                else if (keyName.equalsIgnoreCase("Website"))
                    curGroupMap.put("ICON", R.drawable.web_icon);
                else if (keyName.equalsIgnoreCase("Area Snapshot"))
                    curGroupMap.put("ICON", R.drawable.camera_icon);
                else if (keyName.equalsIgnoreCase("Overview"))
                    curGroupMap.put("ICON", R.drawable.overview_icon);  
                else if (keyName.equalsIgnoreCase("Location"))
                    curGroupMap.put("ICON", R.drawable.map_icon);
                else
                    curGroupMap.put("ICON", R.drawable.icon);

                //Pop on the Name and Value
                curGroupMap.put("NAME", keyName);
                curGroupMap.put("VALUE", value);
            }
        }

        curGroupMap = new HashMap<String, Object>();
        groupData.add(curGroupMap);
        curGroupMap.put("ICON", R.drawable.back_icon);
        curGroupMap.put("NAME","Go Back");
        curGroupMap.put("VALUE","By clicking here");

        //Set up adapter
        mAdapter = new SimpleAdapter(
                mContext,
                groupData,
                R.layout.exp_list_parent,
                new String[] { "ICON", "NAME", "VALUE" },
                new int[] { R.id.photoAlbumImg, R.id.rowText1, R.id.rowText2  }
        );

        myList.setAdapter(mAdapter); //Bind the adapter to the list 


4 commentaires

Ok, je vais mordre. Pourquoi avez-vous besoin d'un MAPView dans une liste de liste?


De plus, quels problèmes connaissez-vous?


Hypothétique - Vous listez tout pour une entreprise spécifique..Je souhaitez afficher une carte de l'endroit où elle est dans la liste. Le problème que je ressens est que je ne sais pas où commencer. J'aimerais contenir-le dans une liste de réception plutôt que de devoir commencer une nouvelle intention (ce type de défaite le but de listeView).


Hey Ryan, avez-vous fait avec MapView à ListAdapter? J'essaie également de mettre en œuvre une telle fonctionnalité.


5 Réponses :


4
votes

Dans ce cas, vous ajouteriez la carteView à la liste, comme vous le feriez d'une autre vue. Voici un tutoriel rapide sur la façon de créer un Adaptateur de liste personnalisé. Mais je dois vous mettre en garde, une carte de carte est une vue assez lourde et si vous essayez de vous mettre un tas d'entre eux sur l'écran, vous allez remarquer que l'application est lente! Vous pouvez simplement ajouter un bouton à l'élément de la liste qui prend l'utilisateur à une autre page avec plus d'informations, y compris une carte.


3 commentaires

Je pense que le lien n'est pas pour montrer MapView dans un adaptateur personnalisé ... veuillez me guider pour avoir une carte à ListAdapter


J'ai SoutenirMapfragment, puis-je utiliser à l'intérieur de ListView Row,? J'ai un adaptateur personnalisé, mais je ne comprends pas comment utiliser la carte à l'intérieur getchildView () de BASEEXPandablelistadapter . Tout simplement, nous pouvons faire comme ((textview) converview.findviewyid (r.id.parent_txt_list_title)). Settex t (parent.gettitle ()); mais comment nous pouvons faire la même chose pour la carte . Pouvez-vous m'aider s'il vous plaît


J'ai ajouté une carte dans une liste de liste mais face à un problème de zoom / pinch. en raison du défilement des parents.



6
votes

Tout d'abord, je ne pense pas que l'affichage de plusieurs cartes de travail fonctionnera à la fois fonctionner. Documents de mapactivité que seul l'un est pris en charge par processus:

"Une seule mapactivité est prise en charge par processus. Plusieurs mapactivités fonctionnant simultanément sont susceptibles d'interférer de manière inattendue et indésirable."

( http://code.google.com /android/add-ons/google-apis/reeference/index.html )

Cela ne dit pas explicitement que vous ne pouvez pas avoir plusieurs cartes dans une mappeuse, mais je pense qu'ils interfèrent également, quel que soit le type de groupe de visiteurs des parents.

Deuxièmement, vous pouvez envisager d'utiliser l'API de cartes statiques pour obtenir une image simple pour l'inclusion dans la liste de réception - une carte de carte à part entière peut être inutile de manière inutile dans tous les cas:

http://code.google.com/apis/maps/documentation/staticmaps /

Le seul problème que vous pouvez potentiellement affronter est que l'API de cartes statiques limite l'utilisation par "utilisateur", qui signifie probablement par IP (il ne nécessite pas de clé d'API), et les réseaux mobiles peuvent être problématiques avec la limitation de l'utilisation IP. Je ne suis pas sûr de savoir exactement comment ça va jouer.


2 commentaires

Hey Steve - Je n'essaie pas d'afficher plusieurs cartes .Views..unly un. L'objectif est également d'interagir par l'utilisateur avec la carte afin qu'une carte statique ne fonctionne malheureusement pas. Merci pour votre suggestion cependant :)


Ah, je vois. Dans ce cas, vous pouvez utiliser une carte de liste personnalisée, comme noté CASEYB, ou peut-être simplement utiliser une verticale linearlayout dans une vision de Scrollie, si les éléments de votre liste sont largement hétérogènes.



56
votes

Pour poster une solution alternative à une réponse assez ancienne (plus de 2 ans en fait), mais je pensais que cela pourrait aider quelqu'un qui pourrait trébucher sur ce poste comme je l'ai fait.

Note: Cela pourrait être utile pour quelqu'un qui est simplement Doit afficher l'emplacement dans une "carte" mais n'a pas besoin d'interagir avec celui-ci dans le listview . La carte actuelle peut être affichée sur Say, une page Détails , après avoir cliqué sur un élément du listview

comme indiqué par @caseyb, MAPVIEW est une sorte de vue imprenable. Pour contrer cet aspect (et rendre la vie un peu mais plus facile pour moi ;-)), j'ai choisi de construire une URL comme vous le feriez pour une carte Google statique, en utilisant plusieurs paramètres nécessaires à mon application. Vous pouvez obtenir plus d'options ici: https://developers.google.com/maps/documentation/staticmaps/

Premièrement, lorsque je construit les données de mon listview , je passe des données telles que la latitude et longitude à Une chaîne avec des variables statiques extraites du lien mentionné ci-dessus. Je reçois mes coordonnées de l'API Facebook.

Le code que j'utilise pour construire le lien: xxx

L'URL construite ci-dessus, lorsqu'il est utilisé dans Un navigateur, renvoie un fichier .png . Ensuite, dans mon adaptateur pour l'activité, j'utilise chargement paresseux de Fedor pour afficher l'image générée à partir de l'URL contenue précédemment à afficher dans la liste personnalisée listview . Vous pouvez bien sûr choisir votre propre méthode pour afficher cette carte (code> (image de la carte en réalité).

Un exemple du résultat final.

Entrez la description de l'image ici

Actuellement, j'ai environ 30 cartes à checkin impaires (je l'utilise conjointement avec le Facebook SDK) dans ce listview , mais les utilisateurs peuvent avoir 100 d'entre eux et il n'y a pas eu aucune notification de cela ralentissement.

Je soupçonne, cela pourrait ne pas aider l'OP à envisager Le temps qui s'est passé depuis la question, mais j'espère que cela aide les autres utilisateurs à atterrir sur cette page à l'avenir.


6 commentaires

Wow, brillante réponse!


Ne pouvait pas penser à une meilleure façon. Bon travail.


Je travaille sur le même problème. Je veux montrer un chemin d'itinéraire réel (pas droite) entre deux emplacements dans la carte dans la vue de la liste. Quelqu'un sache comment y parvenir?


Est-ce toujours la meilleure façon de faire cela? L'Android Google Maps SDK a ajouté un "mode Lite" récemment, mais cette façon semble être plus légère. Existe-t-il un moyen de pouvoir ajouter des étiquettes plus longues aux marqueurs? Il semble que cela soit limité à 1 caractère maintenant.


@JOHNOLEYNIK: Honnêtement, je n'ai pas encore ressenti le besoin de changer l'utilisation de la carte statique. Cela étant dit, j'ai lu le mode Lite dans le nouveau V2 de la SDK et c'est aussi un bitmap d'un emplacement. Et c'est interactif. Cela semble avoir un exemple de travail de mode Lite utilisé dans un listview . Je n'ai pas testé le ou même le code. Mais semble prometteur. Essaie. :-)


C'est une réponse géniale. N'aurait jamais pu y penser. Bravo à toi homme. Pour montrer à PNG dans la liste et montrer une activité avec la carte après que la carte soit choisie, pour moi c'est le meilleur moyen. Pratique et meilleur! Merci!!!



-1
votes

J'ai fait face au même problème aujourd'hui - il est disponible que vous devez créer la carteView à l'intérieur de votre Mapactivité sinon vous obtiendrez une erreur comme Impossible de gonfler la vue Com.google.maps. MapView ou plus ... que de transmettre ce MAPView à votre liste de liste et de la cracher si nécessaire. Je devais placer le MapView à l'intérieur d'un relativenelayout pour ajuster la hauteur et la largeur, car je veux (pour une raison quelconque, MapView ne se comporte pas la "normale" . Vous pouvez me demander des détails si vous voulez :)


0 commentaires

4
votes