2010-09-30 4 views
10

Я думаю, вы все пробовали «Google Адреса» на Картах. Это список POI рядом с вами.Android: компас + расстояние в списке

Я действительно хотел бы сделать такую ​​же функцию в своем приложении со списком координат GPS, но это кажется очень сложным.

Создание списка с расстоянием и маленькой стрелкой очень просто, но я не могу понять, как обновлять этот список и стрелку каждый раз, когда пользователь перемещает свой телефон.

На данный момент у меня есть статический список.

alt text

Я хотел бы знать, если кто-то удастся создать такую ​​ListView.

Большое спасибо за любую информацию.

ответ

10

Есть несколько вариантов того, чего вы пытаетесь достичь. Лично я бы рекомендовал реализовать свой собственный адаптер (скорее всего, в этом случае, расширив SimpleCursorAdapter) и инкапсулируя обновления на расстояние текста и поворот заголовка компаса внутри этого.

Чтобы помочь с управлением ресурсами, возможно, вы захотите создать SensorListener и LocationListener в рамках Activity, в котором будет размещаться ListView. Всякий раз, когда вы получаете сообщение об обновлении, выполните самокалиброванный метод updateCompassAndLocation из класса Adapter.

Из этого метода у вас есть два варианта. Или итерации по каждому из элементов, которые составляют представленный набор данных, и изменяют графический и дистанционный текст компаса, или просто записывают текущее местоположение и заголовок как переменные в классе, и вызывают notifyDataSetChanged, чтобы заставить адаптер обновить сами виды в рамках метода getView. В любом случае (особенно в последнем) вам нужно установить значения расстояния и значения компаса расстояния в 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

Извините за задержку. Я попробовал ваше решение несколько месяцев назад, и я был очень доволен этим. Спасибо большое! –

+0

@Waza_Be было бы здорово, если бы вы могли опубликовать решение, которое вы внедрили для этого, я также пытаюсь сделать то же самое, я столкнулся с проблемами с поворотом заголовка компаса. Спасибо. – dharan

Смежные вопросы