2010-09-30 17 views
10

Domyślam się, że wypróbowałeś "Miejsca Google" w Mapach. Oto lista POI znajdujących się w pobliżu.Android: kompas + odległość w widoku listy

Naprawdę chciałbym zrobić tę samą funkcję w mojej aplikacji z listą współrzędnych GPS, ale to wydaje się bardzo skomplikowane.

Dokonywanie listview z odległością i małą strzałką jest bardzo łatwe, ale nie mogę zrozumieć, jak aktualizować tę listę i strzałkę za każdym razem, gdy użytkownik przenosi swój telefon.

Na razie mam statyczny widok listy.

alt text

Chciałbym wiedzieć, czy ktoś uda się stworzyć taki ListView.

Dziękuję za wszelkie informacje.

Odpowiedz

10

Istnieje kilka opcji dla tego, co próbujesz osiągnąć. Osobiście polecam wdrożenie własnego adaptera (najprawdopodobniej w tym przypadku poprzez rozszerzenie SimpleCursorAdapter) i enkapsulację aktualizacji do tekstu odległości i obrót nagłówka kompasu w tym zakresie.

Aby pomóc w zarządzaniu zasobami, prawdopodobnie chcesz utworzyć SensorListener i LocationListener w ramach działania, które będzie hostować ListView. Po otrzymaniu aktualizacji wywołaj samodzielnie zwiniętą metodę updateCompassAndLocation z poziomu klasy Adapter.

Wewnątrz tej metody dostępne są dwie opcje. Wykonaj iterację dla każdego elementu, który składa się na reprezentowany zbiór danych, zmodyfikuj grafikę kompasu i tekst odległości lub po prostu zapisz bieżącą lokalizację i nagłówek jako zmienne w klasie i wywołaj notifyDataSetChanged, aby zmusić adapter do aktualizacji samych widoków w ramach metody getView. W obu przypadkach (szczególnie tych ostatnich) musisz ustawić wartości odległości i kompasu kursora w 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

Przepraszamy za opóźnienie. Kilka miesięcy temu wypróbowałem Twoje rozwiązanie i byłem z niego bardzo zadowolony. Bardzo dziękuję! –

+0

@Waza_Be byłoby wspaniale, gdybyś mógł opublikować rozwiązanie, co zaimplementowałeś dla tego, ja też próbuję zrobić to samo, mam problemy z obrotem kompasu. Dzięki .. – dharan

Powiązane problemy