2010-09-30 9 views
10

Ich vermute, Sie alle haben "Google Places" in Maps versucht. Dies ist eine Liste von POI in Ihrer Nähe.Android: Kompass + Entfernung in einem Listenansicht

Ich würde gerne das gleiche Feature in meiner Anwendung mit einer Liste von GPS-Koordinaten machen, aber das scheint wirklich kompliziert.

Die Listenansicht mit der Entfernung und dem kleinen Pfeil ist sehr einfach, aber ich kann nicht verstehen, wie man diese Liste und den Pfeil jedes Mal aktualisiert, wenn der Benutzer sein Telefon bewegt.

Für jetzt habe ich eine statische Listview.

alt text

Ich würde gerne wissen, ob jemand gelingt, eine solche Listenansicht zu erstellen.

Vielen Dank für weitere Informationen.

Antwort

10

Es gibt ein paar Optionen für das, was Sie erreichen möchten. Persönlich würde ich empfehlen, Ihren eigenen Adapter zu implementieren (am wahrscheinlichsten in diesem Fall, indem Sie SimpleCursorAdapter erweitern) und die Aktualisierungen in die Text- und Kompass-Kopfzeilenrotation einbetten.

Um bei der Ressourcenverwaltung zu helfen, möchten Sie wahrscheinlich einen SensorListener und einen LocationListener innerhalb der Aktivität erstellen, die die ListView hostet. Wenn Sie ein Update erhalten, rufen Sie Ihre selbstgerollte updateCompassAndLocation Methode aus Ihrer Adapterklasse auf.

Innerhalb dieser Methode haben Sie zwei Möglichkeiten. Blättern Sie entweder über alle Elemente der zu erfassenden Datensammlung, ändern Sie die Kompassgrafik und den Abstandstext oder notieren Sie einfach den aktuellen Standort und die aktuelle Position als Variablen in der Klasse und rufen Sie notifyDataSetChanged auf, um den Adapter zur Aktualisierung der Ansichten zu zwingen innerhalb der getView Methode. In beiden Fällen (besonders in letzterem Fall) müssen Sie die Werte für den Abstandstext und den Kompass in getView festlegen.

@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

Entschuldigung für die Verzögerung. Ich habe deine Lösung vor ein paar Monaten versucht und ich war sehr zufrieden damit. Vielen Dank! –

+0

@Waza_Be es wäre toll, wenn du die Lösung posten kannst, was du dafür implementiert hast, versuche ich auch, das Gleiche zu tun, ich habe Probleme mit der Kompass-Kursdrehung.Thanks .. – dharan