Android: компас + расстояние в списке

Я думаю, вы все пробовали "Google Места" на Картах. Это список POI рядом с вами.

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

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

Теперь у меня есть статический список.

alt text

Я хотел бы знать, если кому-то удастся создать такой список.

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

Ответ 1

Есть несколько вариантов того, чего вы пытаетесь достичь. Лично я бы рекомендовал внедрить свой собственный адаптер (скорее всего, в этом случае, расширив 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);
}