2010-09-30 17 views
10

Je suppose que vous avez tous essayé "Google Adresses" dans Maps. Ceci est une liste de POI proches de vous.Android: boussole + distance dans une vue de liste

Je voudrais vraiment faire la même fonctionnalité dans mon application avec une liste de coordonnées GPS, mais cela semble vraiment compliqué. Faire le listview avec la distance et la petite flèche est très facile, mais je ne peux pas comprendre comment mettre à jour cette liste et la flèche chaque fois que l'utilisateur déplace son téléphone.

Pour l'instant j'ai une liste statique.

alt text

Je voudrais savoir si quelqu'un réussit à créer un tel listview.

Merci beaucoup pour toute information.

Répondre

10

Il y a quelques options pour ce que vous essayez d'accomplir. Personnellement, je vous recommande d'implémenter votre propre adaptateur (très probablement dans ce cas en développant SimpleCursorAdapter) et d'encapsuler les mises à jour de la rotation du texte à distance et de la boussole à l'intérieur de celle-ci.

Pour faciliter la gestion des ressources, vous devez probablement créer un objet SensorListener et LocationListener dans l'activité qui hébergera ListView. Chaque fois que vous recevez une mise à jour, appelez votre méthode updateCompassAndLocation depuis votre classe Adapter. À partir de cette méthode, vous avez deux options:

Passez en revue chacun des éléments composant la collection de données représentée et modifiez le graphique de la boussole et le texte de distance, ou enregistrez simplement l'emplacement et l'en-tête en tant que variables dans la classe et appelez notifyDataSetChanged pour forcer l'adaptateur à mettre à jour les vues. dans la méthode getView. Dans les deux cas (en particulier le dernier), vous devrez définir le texte de distance et les valeurs de boussole de titre dans getView.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LinearLayout myView; 

    MyPOI item = getItem(position); 

    Location poiLocation = item.getLocation; 

    int compassHeading = // Calculate heading relative to current heading 
    float distance = // Calculate distance to POI 


    if (convertView == null) { 
    myView = new LinearLayout(getContext()); 
    String inflater = Context.LAYOUT_INFLATER_SERVICE; 
    LayoutInflater vi = (LayoutInflater)getContext().getSystemService(inflater); 
    vi.inflate(resource, myView, true); 
    } else { 
    trainView = (LinearLayout) convertView; 
    } 

    TextView distanceView = (TextView)trainView.findViewById(R.id.distance); 
    ImageView compassView = (ImageView)trainView.findViewById(R.id.compass); 

    distanceView.setText(String.valueOf(distance); 
    compassView.setImageLevel(compassHeading); 
} 
+0

Désolé pour le retard. J'ai essayé votre solution il y a quelques mois et j'en étais très satisfait. Merci beaucoup! –

+0

@Waza_Be ce serait génial si vous pouvez poster la solution que vous avez mis en œuvre pour cela, je suis également en train d'essayer de faire la même chose, je suis confronté à des problèmes avec la rotation de la boussole.Merci .. – dharan